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
?>
주의사항 및 더 안전한 방법
위 방법은 대부분의 경우에 작동하지만, 몇 가지 주의할 점과 더 안전하게 사용할 수 있는 방법이 있습니다.
- $_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 (대부분의 경우) ?> - 보안: 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>'; ?> - 쿼리 문자열에 특정 파라미터 추가/수정:
- 기존 쿼리 문자열을 유지하면서 특정 파라미터를 추가하거나 수정하고 싶을 때 사용합니다. 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로 이스케이프하는 것이 가장 권장되는 방식 중 하나입니다.
'프로그램 > PHP 초급' 카테고리의 다른 글
| macOS에서 파일 업로드 시 발생하는 한글 자소 분리 문제를 해결 (0) | 2025.06.04 |
|---|---|
| PHP 함수가 있는지 체크하고 정의 하는 방법 (0) | 2025.06.04 |
| Content Security Policy (CSP)엄격하게 설정하는 방법 (0) | 2025.06.04 |
| PHP Path Combine 방법 (0) | 2025.06.04 |
| PHP 텍스트에서 HTML 제거 하는 방법 (0) | 2025.06.04 |