在無限期鬼打牆以後,才發現 HTTP Referer 不一定真的代表參考位址。
假設有三個頁面:
- form.html:填資料
- proccess.php:處理表單內容
- showError.php:表單內容有誤時,重新導向到這一頁
一般情況下 process.php 的 referer 會是 form.html、showError.php 的 referer 會是 process.php,但若 proccess.php 跳轉頁面是這樣寫:
if( ERROR ){
header('Location: showError.php');
}
執行後 HTTP server 的回應會是 HTTP 302 而非 HTTP 200,瀏覽器不會將 302 視為正常的瀏覽行為,所以 proccess.php 不會被列入正式瀏覽記錄,當重新導向到 showError.php 時,Refer 仍然會是最後一個正式的瀏覽記錄,也就是 form.html。
若希望讓 showError.php 可以正確知道是哪一頁連過來的,就得靠其他方法了。
在這裡建議不要使用 HTTP Referer 來做判斷的依據。現有瀏覽器開發工具、外掛都可以讓人任意修改 Referer,也聽說有些防毒軟體會固定將 Referer 從 HTTP request 中刪除,再者,各家瀏覽器送 Referer 的情況也不同 (IE MUST DIE),用 Referer 判斷流程等方法會遇到不少例外情況要處理,別讓自己那麼累。
Reference:
php – HTTP_REFERRER and Location redirect – Stack Overflow