HOWTO · PHP
PHP에서 리디렉션
이 튜토리얼은 PHP에서 페이지에서 다른 페이지로 사용자를 리디렉션하는 방법을 보여줍니다.
이 페이지의 내용
PHP에서 요청을 리디렉션하려면 스크립트가 HTML이나 다른 내용을 출력하기 전에 header()로 Location 응답 헤더를 보내고 스크립트를 종료합니다. 아래 예제는 브라우저를 지정한 URL로 이동시킵니다. PHP 파일을 로컬 웹 서버에 올린 뒤 브라우저에서 열면 이동을 확인할 수 있습니다.
PHP의 header() 함수로 URL 리디렉션하기
header() 함수는 HTTP 응답 헤더를 전송합니다. 리디렉션에 사용하는 헤더 필드는 Location이며, 값으로 목적지 URL을 지정합니다. PHP는 공백을 포함해 응답 본문에 해당하는 내용을 보내기 전에 이 헤더를 전송해야 합니다. 리디렉션 코드는 템플릿이나 페이지 내용을 출력하기 전에 요청 처리기 앞부분에 두세요.
독립 실행형인 이 예제는 변수에 저장한 목적지 URL을 사용합니다. 응답을 준비한 뒤 exit 호출로 현재 요청을 끝내므로, 리디렉션이 일어나지 않은 것처럼 페이지의 나머지 부분이 계속 실행되지 않습니다. 제공된 런타임 검사에서 이 예제는 성공했으며 표준 출력은 비어 있었습니다. 리디렉션은 텍스트로 출력되는 것이 아니라 HTTP 응답에 담깁니다. PHP 파일을 로컬 웹 서버를 통해 브라우저에서 열면 예제의 목적지로 이동합니다.
<?php
$url = 'https://example.com/';
header('Location: ' . $url);
exit;
?>
애플리케이션에서 사용자를 보내도 되는 URL을 사용하세요. 목적지가 요청 데이터에서 온다면 허용 목록에 있는지 검증하거나 신뢰할 수 있는 애플리케이션 경로로 구성하세요. 임의의 사용자 입력을 리디렉션에 넘기면 방문자가 원치 않는 사이트로 이동할 수 있습니다. 같은 애플리케이션 안의 경로라면 /account/와 같은 경로만으로 충분한 경우가 많습니다.
HTTP 상태 코드를 받는 PHP 리디렉션 헬퍼 함수 만들기
재사용할 수 있는 redirect 헬퍼 함수는 목적지와 응답 상태를 모두 인수로 받을 수 있습니다. header()의 세 번째 인수가 상태 코드이고, 두 번째 인수는 같은 이름의 기존 헤더를 새 헤더로 대체할지 제어합니다. 아래 함수는 일반적으로 임시 리디렉션에 사용하는 302를 기본값으로 설정하며, 경로에 따라 다른 상태 코드도 받을 수 있습니다.
<?php
function redirect(string $url, int $statusCode = 302): void
{
header('Location: ' . $url, true, $statusCode);
exit;
}
redirect('https://example.com/', 301);
?>
예제에서는 이 목적지가 영구적으로 변경되었음을 나타내기 위해 301을 전달합니다. 이동이 계속 유지될 때만 이 상태 코드를 사용하세요. 브라우저와 다른 클라이언트가 영구 리디렉션을 기억할 수 있습니다. 목적지가 바뀔 수 있다면 임시 리디렉션인 302가 더 적절한 기본값입니다. PHP의 header() 매뉴얼에서 함수 매개변수를 설명하며, MDN의 301 참고 문서는 영구 상태 코드를 다룹니다.
제공된 런타임 검사에서 이 헬퍼 예제도 성공했으며 표준 출력은 비어 있었습니다. 리디렉션 상태 코드와 Location 헤더는 출력 텍스트가 아니라 HTTP 응답의 일부입니다. 브라우저에서 이동을 확인하려면 PHP 파일을 로컬 웹 서버를 통해 실행하세요. 이 함수는 응답 헤더를 설정한 뒤 요청을 종료합니다. 실제 애플리케이션에서는 헬퍼를 호출하기 전에 URL을 검증하고, 이동이 임시인지 영구인지에 맞는 상태 코드를 선택하세요. Location 헤더와 상태 코드는 HTTP 응답에 포함되므로 브라우저에 페이지 본문이 전달되기 전에 처리됩니다.
JavaScript를 클라이언트 측 리디렉션 대체 방법으로 사용하기
서버 측 리디렉션을 사용할 수 없다면 window.location을 사용해 브라우저에서 페이지를 이동시킬 수 있습니다. 이는 클라이언트 측 이동입니다. PHP가 페이지 내용을 보내고 브라우저가 스크립트를 실행합니다. PHP 출력 버퍼링과는 다르며, HTTP 응답을 서버 측 리디렉션 응답으로 바꾸지도 않습니다. JavaScript가 활성화되어 있어야 하므로 서버에서 페이지를 보내기 전에 목적지를 결정할 수 있다면 PHP의 header() 방식을 사용하세요.
아래 브라우저 페이지 코드 조각은 대체 방법을 보여 줍니다. 로컬 웹 서버에서 제공할 수 있는 페이지에 추가한 다음, JavaScript가 활성화된 브라우저에서 페이지를 열면 목적지로 이동합니다. 이 코드 조각은 브라우저에서 사용할 코드로 제시된 것이며, 이 글을 위해 실행되지는 않았습니다.
<script>
window.location = "https://example.com/";
</script>
이 코드는 브라우저에서 실행되므로 이미 받은 응답에 301과 같은 HTTP 리디렉션 상태 코드를 보낼 수 없습니다. 서버 측 리디렉션과 마찬가지로 목적지를 고정하거나, 목적지를 만드는 데 사용하는 값을 검증하세요. 클라이언트 측 이동이 적합한 경우에만 이 대체 방법을 사용하세요. JavaScript를 비활성화한 방문자는 원래 페이지에 그대로 남습니다.