重定向來自錯誤Referer的使用者
忽略我們是否應該進行此更改的優點(情況稍微複雜並且可能包含在我的 NDA 中),我們的客戶希望我們要求我們正在建構的站點的訪問者來自他們的另一個站點。如果使用者從其他地方來到我們這裡,他們應該被發送到該其他站點的登錄螢幕。
感覺最簡單的方法是使用
mod_rewrite
既不是我們的網站也不是另一個網站的引薦來源網址重定向任何內容。我目前的想法是
在
httpd.conf
RewriteMap deflector txt:/path/to/deflector.map RewriteCond %{HTTP_REFERER} !="" RewriteCond ${deflector:%{HTTP_REFERER}|NOT-FOUND} =NOT-FOUND RewriteRule ^ http://www.theothersite.com/login.jsp [R=307,L]
在
deflector.map
//www.oursite.com/ - //oursite.com/ - //www.theothersite.com/ - //theothersite.com/ -
這將使我們能夠很容易地擴展“允許的推薦人”列表,這感覺是個好主意。
那我有三個問題:
mod_rewrite
(我們已經廣泛使用)是最好的方法嗎?- 如果是,那麼
307 Temporary Redirect
響應是處理它的最佳方式嗎?- 由於我主要不是 LAMP 開發人員/管理員,所以我在那些重寫規則中犯了任何愚蠢的錯字嗎?;o)
對我來說,這
307 Temporary Redirect
是403 Forbidden
最合適的狀態程式碼,我認為發送帶有響應的Location:
重定向標頭是一件壞事™ 。4xx
這一切都有意義嗎?
**編輯:*地圖搜尋是否預設區分大小寫?*我需要擔心這裡的情況嗎?
**編輯 2:**地圖搜尋是正則表達式搜尋還是全鍵匹配?如果地圖包含
www.foo.com
並且Referer:
標題讀取http://www.foo.com/bar.php
它會匹配嗎?
我們實際上最終做瞭如下:
RewriteCond %{REMOTE_HOST} !A.B.C.(D|E) RewriteCond %{HTTP_HOST}==%{HTTP_REFERER} !^(.*?)==https?://\1/ [NC] RewriteCond %{HTTP_REFERER} !https?://referring.domain.com/ [NC] RewriteRule ^ https://referring.domain.com/path/to/login/script [R,L]
第一
RewriteCond
行(以及更多類似的行)意味著開發人員和客戶不受此推薦人檢查的限制(因為在訪問我們的網站之前必須先去那裡真的很煩人)。第二個
RewriteCond
是天才的工作,檢查引用者是否與Host:
請求中的相同。這是基於terrye對 SO#7398191: Generic mod_rewrite referrer check的回答——因為mod_rewrite
只在測試字元串中進行變數插值,所以不能讀取行RewriteCond %{HTTP_HOST} !^https?://%{HTTP_REFERER}/ [NC]
因為它根本不會做那個檢查。
顯然,我們“從不”需要允許任何其他推薦人。如果我們這樣做了,我想我只需要將最後
RewriteCond
一行設置為結束[NC,OR]
並連結更多條件。一切都很好。謝謝大家的幫助!
我認為地圖將區分大小寫,並且您還需要從
Referer
. 我根本沒有測試過它,但這樣的事情可能會奏效:RewriteMap deflector txt:/path/to/deflector.map RewriteMap lc int:tolower RewriteCond %{HTTP_REFERER} ^https?://([^:/?]+) RewriteCond ${lc:%1} (.+) RewriteCond ${deflector:%1|NOT-FOUND} =NOT-FOUND RewriteRule ^ http://example.com/ [L]
不要亂用不尋常的響應程式碼;預設的 302 很好。