一、UA是什么?
User Agent 簡稱UA,就是用戶代理。通常我們用瀏覽器訪問網站,在網站的日志中,我們的瀏覽器就是一種UA。
二、禁止特定UA訪問
最近有個網站(www.C.com)抄襲公司主站(www.A.com)的內容,除了域名不同,內容、圖片等都完全是我們主站的內容。
出現這種情況,有兩種可能:
一種是:它用爬蟲抓取公司主站(www.A.com)的內容並放到自己服務器上顯示;
另一種是:通過將訪問代理至公司主站(www.A.com),而域名(www.C.com)是盜用者的,騙取流量。
無論怎樣,都要禁止這種行為的繼續。
通過分析日志,沒有發現爬蟲大量爬取公司主站(www.A.com)內容頁面的信息。
測試是否是代理,測試步驟:
1)訪問www.C.com並指定參數
URL : www.C.com/chaojikaifangfu.html/?cccc
2)檢查公司主站的web服務器上的nginx日志
發現有記錄,說明剛才的訪問被代理到公司主站web上了。

UA(雙引號里邊的是UA的全名):Resty/HTTP 0.03 (Lua)
有兩種方法解決:
1)禁止IP
2)禁止UA
從nginx日志觀察,訪問者的代理IP經常變,但是訪問UA卻是固定的,因而可以禁止UA。
禁止特定UA:
1)nginx配置信息
nginx配置目錄:/usr/local/nginx/conf/
2)在nginx配置目錄中,創建新的配置文件agent_deny.conf,添加如下內容:
# 禁止特定UA訪問
# ~ "Lua" :表示用戶UA匹配"Lua"字符串,區分大小寫
# 當用戶UA被匹配成功,則返回403錯誤,不給予訪問。 if ($http_user_agent ~ "Lua"){ return 403; }
3)添加該配置到相應的server或location段
include agent_deny.conf;
注意:不能加到http段,if 用於http段會報語法錯誤的。
4)使配置生效
nginx -t
nginx -s reload
5)檢查禁止特定UA的功能是否成功
利用curl工具,指定UA去訪問公司主站(www.A.com)
沒禁止特定UA前,訪問結果:
# curl -I -A "Resty/HTTP 0.03 (Lua)" www.A.com HTTP/1.1 200 OK Content-Type: text/html; charset=utf-8 Connection: keep-alive Date: Thu, 03 Nov 2016 15:50:13 GMT Content-Length: 361168 Vary: Accept-Encoding Age: 294 Pragma: public Server: nginx Accept-Ranges: bytes
禁止特定UA后,訪問結果:
# curl -I -A "Resty/HTTP 0.03 (Lua)" www.A.com HTTP/1.1 403 Forbidden Server: nginx Date: Thu, 03 Nov 2016 15:55:17 GMT Content-Type: text/html Content-Length: 162 Connection: keep-alive
對比兩次結果,發現:nginx已經能禁止特定的UA訪問了。
補充:
觀察一陣子后,發現還有禁止UA為空的訪問和放行內網ip不做禁止的需求。
nginx的配置中不支持if條件的邏輯與、邏輯或運算 ,並且不支持if的嵌套語法,但我們可以使用變量達到想要的效果。
#白名單:192.168.1 #禁止特定UA和UA為空的訪問 set $flag 0; if ($remote_addr !~ "^(192.168.1)"){ set $flag "${flag}1"; } if ($http_user_agent ~ "Lua|^$"){ set $flag "${flag}2"; } if ($flag = "012"){ return 403; }
注意:以下的寫法是錯誤的!!!
if ($remote_addr !~ "^(192.168.1)" && $http_user_agent ~ "Lua|^$") { return 403; }
