先看下兩種HTTP head 一個是直接輸入網址打開的head,另一個是通過搜索引擎打開的網址head
一:直接輸入網址打開的
(Request-Line) GET / HTTP/1.1
Host hcoberlinol.com
User-Agent Mozilla/5.0 (Windows NT 5.1; rv:18.0) Gecko/20100101 Firefox/18.0
Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding gzip, deflate
二:通過搜索引擎打開的
(Request-Line) GET / HTTP/1.1
Host hcoberlinol.com
User-Agent Mozilla/5.0 (Windows NT 5.1; rv:18.0) Gecko/20100101 Firefox/18.0
Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding gzip, deflate
Referer http://www.google.com.hk/search?hl=zh-CN&newwindow=1&safe=strict&site=&source=hp&q=site%3Ahcoberlinol.com&btnK=Google+%E6%90%9C%E7%B4%A2
Connection keep-alive
If-Modified-Since Tue, 22 Jan 2013 07:18:31 GMT
Cache-Control max-age=0
可以看出兩者的主要區別在於referer,
了解了背景知識後我們來解決問題
現公司要求實現通過搜索引擎打開這個網址的化進行跳轉到別的網址
直接輸入網址打開的就打開這個網址
valid_referers 指令詳解
該指令後面可以接 none blocked serevr_names string或者是正則表達式
none 代表沒有referer
blocked 代表有referer但是被防火牆或者是代理給去除了
string或者正在表達式 用來匹配referer
nginx會通過查看referer字段和valid_referers後面的referer列表進行匹配,如果匹配到了就invalid_referer字段值為0 否則設置該值為1
實現這一功能的代碼
valid_referers none blocked server_names;
if ($invalid_referer) {
rewrite ^/ http://********.com/ redirect;
}
這裡我講解下
1.首先當我輸入我要打開的網址的時候,因為是直接輸入的沒有referer所以匹配了
valid_referers後面的none或者是blocked 所以invalid_referer值為0 所以不進行跳轉.
當我是從這個網站裡面的鏈接跳到該網站首頁的時候 因為referer的值是肯定包含srever_names 所以匹配了server_names所以不進行跳轉.
2.當我從搜素引擎進去的時候因為referer字段類似於www.google.com.hk/search
開始進行匹配 發現沒有一個匹配,則此時會設置invalid_referer值為1 if語句成功執行,進行了跳轉. 達到功能