권한을 체크해서 권한에 맞게 redirect 하는 php 파일이 있을 때,

header() 함수를 이용해서 redirect 할 경우,

랜딩페이지에선 $_SERVER['HTTP_REFERER'] 의 내용을 확인할 방법이 없음.


301, 302, 303, 307 아무것도 안됨.

// 아래의 모든 방법으로 redirect된 dest.php 에서 HTTP_REFERER를 획득할 수 없음.

// 301 Moved Permanently
header('Location: /dest.php', true, 301);

// 302 Found
header('Location: /dest.php', true, 302);
header('Location: /dest.php');

// 303 See Other
header('Location: /dest.php', true, 303);

// 307 Temporary Redirect
header('Location: /dest.php', true, 307);




무슨 문제인가 하고 좀 찾아봤더니 그냥 원래 안되는 게 맞는거였음..;



일단, RFC2616에서 redirect와 referer 관련 항목을 뒤져봐도 redirect시 referer를 남겨야 한다는 규약이 없음.

redirect: http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3

referer: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.36



그리고 대강 분위기가 개인정보 등 보안상의 이유로 referer를 꺼리는 분위기가 감지됨.

아래 위키페이지 단락의 내용처럼 아예 referer를 없애려는 목적으로 redirect를 사용하는 경우도 있다하니.

http://en.wikipedia.org/wiki/URL_redirection#Removing_referer_information



redirect를 하면서 referer를 보존하려면,

쿠키/세션을 이용하거나 $_GET parameter로 보내거나 하는 수 밖에 없음.


아니면 header()를 이용한 redirect가 아니라,

javascript 코드나 <META> 태그를 이용한 redirect를 하면 그대로 살릴 수 있음.

// $_GET
header('Location: /dest.php?referer='.urlencode($_SERVER['REQUEST_URI']);

// js 
echo '<script>top.location.replace("/dest.php");</script>';
exit;

// META
echo '<meta http-equiv="refresh" content="0; url=/dest.php" />';
exit;








Posted by bloodguy
,