nginx 實現valid_referer全面解析


先來補充點知識,然后在進行講解。

先看下兩種HTTP head 一個是直接輸入網址打開的head,另一個是通過搜索引擎打開的網址head

一:直接輸入網址打開的

  1. (Request-Line)  GET / HTTP/1.1
  2. Host    hcoberlinol.com
  3. User-Agent  Mozilla/5.0 (Windows NT 5.1; rv:18.0) Gecko/20100101 Firefox/18.0
  4. Accept  text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
  5. Accept-Language zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
  6. xxxxxxxxxxxxxxx gzip, deflate

二:通過搜索引擎打開的

  1. (Request-Line)  GET / HTTP/1.1
  2. Host    hcoberlinol.com
  3. User-Agent  Mozilla/5.0 (Windows NT 5.1; rv:18.0) Gecko/20100101 Firefox/18.0
  4. Accept  text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
  5. Accept-Language zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
  6. xxxxxxxxxxxxxxx gzip, deflate
  7. 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
  8. Connection  keep-alive
  9. If-Modified-Since   Tue, 22 Jan 2013 07:18:31 GMT
  10. 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

現我為公司寫出了實現這一功能的代碼

 

  1. valid_referers none blocked server_names;
  2. if ($invalid_referer) {
  3.  rewrite ^/ http://********.com/ redirect;
  4. }

這里我講解下

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語句成功執行,進行了跳轉. 達到功能


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM