[php] 리디렉션 시키기

HTTP 응답상태 코드를 이용한 리디렉션(redirection)에는 간단하지만 복잡한 세부사항이 숨어있습니다. PHP에서 이를 해결하는 방법은 차근차근 살펴봅니다.

 

한 줄로 리디렉션

php로 리디렉션을 하는 방법은 매우 간단합니다. header 함수를 통해 Location 을 기술하면 브라우저가 알아서 리디렉션을 수행합니다.

header( 'Location: http://www.bsidesoft/com' );

본 사이트는 과거에 사용하던 blog.bsidesoft.com 에 대해 전부 www.bsidesoft.com 으로 보내게 되어있습니다. 만약 이렇게 보내지 않는다면 도메인을 기반으로 하는 페이스북 댓글 등이 정상적으로 작동하지 않게 될 것입니다.

 

HTTP응답코드

PHP는 재밌게도 headerLocation을 넣는 것으로 이미 응답코드를 바꿔줍니다. 정확하게는 302 로 바꾸는데 302 의 의미는 임시로 이동이라는 뜻입니다.

만약 항구적으로 이동시키는 경우에는 상태코드 301을 쓰게 되어있고 이 경우는 직접 설정해야 합니다. 따라서 맘편하게 301 이든 302 등 직접 상태코드를 넣어주는 게 오히려 속편합니다.

//항구적으로 이동시킬 때
header( 'HTTP/1.1 301 Moved Permanently' );
header( 'Location: https://www.bsidesoft.com' );

//임시로 이동시킬 때
header( 'HTTP/1.1 302 Moved Temporarily' );
header( 'Location: https://www.bsidesoft.com' );

301과 302외엔 현실에서 거의 쓰이지는 않지만 실무에서 필요하시다면 301~308까지 적절히 대응하면 됩니다.

 

도메인의 판단

그러니까 리디렉션을 시키는 이유는 여러가지가 있지만 대부분 도메인을 평가하게 됩니다.

PHP에서 현재 도메인은 HTTP_HOST 로 얻을 수 있습니다. 따라서 blog.bsidesoft.com 인 경우 www.bsidesoft.com 으로 보내는 전체 코드는 다음과 같이 됩니다.

if( $_SERVER['HTTP_HOST'] == 'blog.bsidesoft.com' ){

	header('HTTP/1.1 301 Moved Permanently' );

	header( 'Location: https://www.bsidesoft.com' );

	exit();

}

 

쿼리스트링의 처리

마지막 단계는 쿼리스트링을 넘겨주는 것입니다. 짜피 리디렉션으로는 post 데이터를 넘길 수는 없습니다. REST에 적합하게 디자인되었다면 충분히 쿼리스트링을 포함하는 URI로 완전히 이전할 수 있을 것 입니다. www.bsidesoft.com/?p=1298 이라는 주소에서 /?p=1298 에 해당되는 값은 REQUEST_URI 에 해당됩니다. 이 부분은 그냥 붙여주면 끝이므로 최종적으로 Location부분은 다음과 같이 됩니다.

header( 'Location: https://www.bsidesoft.com' . $_SERVER['REQUEST_URI'] );

이제 완성되었습니다.

 

%d 블로거가 이것을 좋아합니다: