HOWTO · PHP

PHP에서 현재 전체 URL 가져 오기

이 튜토리얼은 PHP에서 현재 URL을 얻는 방법을 소개합니다.

이 페이지의 내용

현재 PHP 요청의 URL을 확인하거나 구성하려면 요청의 스킴, 호스트, URI를 결합합니다. 쿼리 매개변수에 따라 페이지를 렌더링하거나 요청된 주소를 기록할 때 유용합니다. 구성한 URL은 데이터일 뿐이므로, 리디렉션에 사용하려면 허용할 대상이 무엇인지 별도로 결정해야 합니다.

요청 데이터로 현재 URL 구성하기

PHP에서는 항상 전체 현재 URL을 나타내는 단일 $_SERVER 값을 제공하지 않습니다. 서버는 요청 정보를 여러 조각으로 제공하며, 애플리케이션에서 필요한 조각을 결합합니다. 일반적인 웹 요청에서 스킴은 http 또는 https이고, 호스트에는 포트가 포함될 수 있으며, 요청 URI에는 경로와 쿼리 문자열이 들어 있습니다.

$_SERVER에서 스킴, 호스트, 요청 URI 읽기

$_SERVER는 웹 서버와 런타임이 채우는 슈퍼글로벌 배열입니다. $_SERVER['HTTP_HOST']에는 요청된 호스트가 들어 있고, $_SERVER['REQUEST_URI']에는 보통 경로와 쿼리 문자열이 들어 있습니다. 어느 값도 단독으로는 전체 URL이 아닙니다. 호스트는 들어오는 요청에서 가져오므로 신뢰할 수 없는 입력으로 취급하세요. 리디렉션이나 이메일의 절대 링크처럼 보안에 민감한 출력에 사용하기 전에 알려진 호스트와 대조해 검증해야 합니다.

HTTPS 및 프록시 환경 처리하기

PHP가 TLS를 통해 요청을 직접 받으면 $_SERVER['HTTPS']에는 보통 on 같은 비어 있지 않은 값이 설정됩니다. 스킴을 선택하기 전에 이 값을 확인하되, 모든 서버가 같은 방식으로 설정한다고 가정하지 마세요. $_SERVER['REQUEST_SCHEME']도 제공될 수 있지만, 사용 가능 여부와 의미는 서버 구성에 따라 다릅니다.

리버스 프록시를 사용하는 환경에서는 브라우저가 HTTPS로 연결하더라도 프록시는 HTTP로 PHP에 연결할 수 있습니다. 이 경우 직접 확인한 HTTPS 값은 프록시에서 PHP로 연결하는 방식만 나타낼 수 있습니다. 전달된 스킴 헤더는 애플리케이션이 명시적으로 구성된 신뢰할 수 있는 프록시 뒤에 있고, 프록시가 클라이언트가 보낸 값을 제거하거나 덮어쓸 때만 활용할 수 있습니다. 임의의 요청에서 온 전달 헤더를 신뢰하지 마세요. 프록시와 애플리케이션 계층에서 신뢰 설정을 구성하거나 서버가 안정적으로 제공하는 스킴을 사용하세요.

경로와 쿼리 문자열 포함하기

$_SERVER['REQUEST_URI']에는 /products.php?category=books&page=2 같은 값이 들어가는 경우가 많습니다. 이 값을 덧붙이면 경로와 쿼리 문자열을 모두 포함할 수 있습니다. 이 값에는 스킴이나 호스트가 들어 있지 않습니다. 쿼리 문자열에는 비공개 정보나 민감한 값이 포함될 수 있으므로 로그, 페이지 출력 또는 이메일로 보내는 URL에 이를 포함해도 되는지 검토하세요. 애플리케이션의 라우팅과 배포 구성을 고려하지 않은 채 요청 URI를 표준 URL로 취급하지 마세요.

방법 선택 및 결과 확인

웹 서버가 요청을 직접 처리하는 일반적인 경우에는 서버 값을 명시적으로 결합하면 됩니다. 다음의 독립적인 예제에서는 결합 과정을 쉽게 볼 수 있도록 대표적인 요청 값을 사용합니다. 이 작성 단계에서는 실행하지 않았습니다.

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

<?php
$_SERVER = [
    'HTTPS' => 'on',
    'HTTP_HOST' => 'shop.example.test',
    'REQUEST_URI' => '/products.php?category=books&page=2',
];

$isHttps = isset($_SERVER['HTTPS'])
    && $_SERVER['HTTPS'] !== ''
    && strtolower((string) $_SERVER['HTTPS']) !== 'off';
$scheme = $isHttps ? 'https' : 'http';
$host = $_SERVER['HTTP_HOST'];
$requestUri = $_SERVER['REQUEST_URI'];
$currentUrl = $scheme . '://' . $host . $requestUri;

echo $currentUrl, PHP_EOL;

결과 문자열은 스킴, 호스트, 요청 URI를 결합해 만들어집니다. 애플리케이션에서는 실제 요청에서 전달된 값을 사용하고, 웹 서버와 신뢰할 수 있는 프록시가 해당 값을 어떻게 채우는지 확인하세요. 결과를 리디렉션에 사용하기 전에 호스트를 검증해야 합니다. 현재 URL을 구성했다고 해서 임의의 리디렉션 대상이 안전해지는 것은 아닙니다.