PHP SELF 와 query string 결합하는 방법

2025. 6. 4. 22:33프로그램/PHP 초급

PHP에서 $_SERVER['PHP_SELF']와 $_SERVER['QUERY_STRING']을 결합하는 방법은 현재 스크립트의 경로와 현재 URL의 쿼리 문자열을 합쳐서 완전한 요청 URL을 재구성하는 것입니다.

 

 

 

이것은 보통 현재 페이지로 다시 데이터를 전송하거나, 현재 페이지의 상태를 유지한 채 다른 동작을 수행하는 링크를 생성할 때 유용합니다.

기본 결합 방법

가장 기본적인 방법은 ? 기호를 사용하여 두 값을 연결하는 것입니다.

PHP
 
<?php

// 예시: 현재 URL이 http://example.com/dir/page.php?id=123&name=test 라고 가정
$php_self = $_SERVER['PHP_SELF'];       // /dir/page.php
$query_string = $_SERVER['QUERY_STRING']; // id=123&name=test

$full_request_uri = $php_self;

if (!empty($query_string)) {
    $full_request_uri .= '?' . $query_string;
}

echo "현재 요청 URI: " . $full_request_uri;
// 출력: /dir/page.php?id=123&name=test

?>

주의사항 및 더 안전한 방법

위 방법은 대부분의 경우에 작동하지만, 몇 가지 주의할 점과 더 안전하게 사용할 수 있는 방법이 있습니다.

  1. $_SERVER['REQUEST_URI'] 사용 고려:
    • $_SERVER['PHP_SELF']는 스크립트 파일의 경로만을 나타내고, $_SERVER['QUERY_STRING']은 쿼리 문자열만을 나타냅니다.
    • $_SERVER['REQUEST_URI']는 현재 요청의 완전한 URI (경로 + 쿼리 문자열)를 포함하는 경우가 많아, 더 간편하고 정확할 수 있습니다.
    • 주의: REQUEST_URI는 웹 서버(Apache, Nginx 등) 설정에 따라 포함되는 내용이 다를 수 있습니다. 대부분의 웹 서버에서는 원하는 대로 동작하지만, 특정 환경에서는 인코딩 문제나 예상치 못한 문자가 포함될 수 있습니다.
    PHP
     
    <?php
    // 예시: http://example.com/dir/page.php?id=123&name=test
    $request_uri = $_SERVER['REQUEST_URI'];
    echo "현재 요청 URI (REQUEST_URI): " . $request_uri;
    // 출력: /dir/page.php?id=123&name=test (대부분의 경우)
    ?>
    
  2. 보안: XSS 공격 방어 (htmlspecialchars):
    • $_SERVER['PHP_SELF']는 사용자 입력에 의해 조작될 수 있는 취약점이 있습니다 (XSS 공격). 예를 들어, http://example.com/index.php/%22%3E%3Cscript%3Ealert('xss')%3C/script%3E 와 같이 URL을 조작하여 PHP_SELF에 악성 스크립트가 포함될 수 있습니다.
    • 따라서 $_SERVER['PHP_SELF']를 HTML에 직접 출력할 때는 반드시 htmlspecialchars() 함수를 사용하여 이스케이프해야 합니다.
    PHP
     
    <?php
    $php_self_safe = htmlspecialchars($_SERVER['PHP_SELF']);
    $query_string_safe = htmlspecialchars($_SERVER['QUERY_STRING']); // 쿼리 문자열도 포함될 수 있으니 안전하게
    
    $full_request_uri_safe = $php_self_safe;
    if (!empty($query_string_safe)) {
        $full_request_uri_safe .= '?' . $query_string_safe;
    }
    
    echo '<a href="' . $full_request_uri_safe . '">현재 페이지로 돌아가기</a>';
    ?>
    
  3. 쿼리 문자열에 특정 파라미터 추가/수정:
    • 기존 쿼리 문자열을 유지하면서 특정 파라미터를 추가하거나 수정하고 싶을 때 사용합니다. parse_str()과 http_build_query() 함수를 활용합니다.
    PHP
     
    <?php
    $current_query_string = $_SERVER['QUERY_STRING'];
    $current_params = [];
    parse_str($current_query_string, $current_params); // 현재 쿼리 문자열을 배열로 파싱
    
    // 새로운 파라미터 추가 또는 기존 파라미터 수정
    $new_params = array_merge($current_params, ['action' => 'edit', 'page' => 2]);
    
    // 배열을 다시 쿼리 문자열로 변환
    $new_query_string = http_build_query($new_params);
    
    $full_new_uri = $_SERVER['PHP_SELF'];
    if (!empty($new_query_string)) {
        $full_new_uri .= '?' . $new_query_string;
    }
    
    echo "새로운 URI: " . $full_new_uri;
    // 예: 현재 URL이 page.php?id=10 이면, 출력은 page.php?id=10&action=edit&page=2
    ?>
    

요약 및 권장 사항

  • 가장 간단한 조합: $_SERVER['PHP_SELF'] . '?' . $_SERVER['QUERY_STRING'] (단, QUERY_STRING이 비어있지 않을 때만 ? 추가)
  • 더 간편한 대안: $_SERVER['REQUEST_URI'] (대부분의 환경에서 잘 작동하지만, 서버 설정에 따라 다를 수 있음)
  • 보안 필수: HTML 출력 시 반드시 htmlspecialchars()로 이스케이프하여 XSS 공격을 방지하세요.
  • 쿼리 파라미터 조작: 기존 쿼리 문자열을 기반으로 파라미터를 추가/수정하려면 parse_str()과 http_build_query()를 사용하세요.

어떤 방법을 선택할지는 사용하려는 목적과 보안 요구사항에 따라 달라집니다. 일반적으로 REQUEST_URI를 사용하되, htmlspecialchars로 이스케이프하는 것이 가장 권장되는 방식 중 하나입니다.