先來補充點知識,然后在進行講解。
先看下兩種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
- xxxxxxxxxxxxxxx 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
- xxxxxxxxxxxxxxx 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語句成功執行,進行了跳轉. 達到功能