권한을 체크해서 권한에 맞게 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;
'PHP' 카테고리의 다른 글
[PHP] MongoDB _id로 query 하기 (query on _id) (0) | 2014.12.23 |
---|---|
[PHP] 클래스 이름 관련 함수들 (functions about class name) (0) | 2014.12.04 |
[PHP] 에디트플러스에서 다른 IDE처럼 함수정의부분으로 이동하는 기능구현 (EditPlus jump to declaration) (2) | 2014.10.11 |
[PHP] Windows에서 백그라운드로 커맨드 실행 (PHP exec as background process on Windows) (0) | 2014.10.09 |
[PHP] Windows LoadAverage 알아내기 (0) | 2014.09.05 |