Nginx防盜鏈
一.原理
二.配置指令
三.實例配置
一.原理
盜鏈是一種損害原有網站合法利益,給原網站所在服務器造成額外負擔的非法行爲。要採取防盜鏈的措施,首先需要了解盜鏈的實現原理。 客戶端向服務器請求資源時,爲了減少網絡帶寬,提高響應時間,服務器一般不會一次將所有資源完整地傳回給客戶端。比如在請求一個網頁時,首先會傳回該網頁的文本內容,當客戶端瀏覽器在解析文本的過程中發現有圖片存在時,會再次向服務器發起對該圖片資源的請求,服務器將存儲的圖片資源再發送給客戶端。在這個過程中,如果該服務器上只包含了網頁的文本內容,並沒有存儲相關的圖片資源,而是將圖片資源鏈接到其他站點的服務器上去了,這就形成了盜鏈行爲。
比如內網用戶通過Internet訪問域名爲www.test.com這個服務器上的WEB服務,而該服務器沒有存儲圖片資源,而是將圖片鏈接到域名爲www.fz.com服務器上,這就形成了盜鏈行爲。這種情況下客戶端請求 圖片資源實際上是來自其他的服務器。
要實現防盜鏈,需要了解HTTP協議中的請求頭部的Referer頭域和採用URL的格式表示訪問當前網頁或者文件的源地址。通過該頭域的值,我們可以檢測到訪問目標資源的源地址。這樣,如果我們檢測到Referer頭域中的值並不是自己站點內的URL,就採取組織措施,實現防盜鏈。
需要注意是,由於Referer頭域中的值可以被更改的,因此該方法不能完全阻止所有盜鏈行爲。
二.配置指令
Nginx配置中有一個指令valid_referers,用來獲取Referer頭域中的值,並且根據該值的情況給Nginx全局變量$invalid_referer的值,如果Referer頭域中沒有符合valid_referers指令配置的值,$invalid_referer變量將會被賦值爲1。
valid_referer指令的語法結構爲:
valid_referers none | blocked | server_names | string ....; none 檢測Referer頭域不存在的請求 blocked 檢測Referer頭域的值被防火牆或者代理服務器刪除或僞裝的情況。 這種情況下,該頭域的值不以“http://”或者“https://”開頭 server_names 設置一個或多個URL,檢測Referer頭域的值是否是這些URL中的某個。 從nginx 0.5.33以後支持使用通配符“*”。
三.實例配置
環境:2臺CentOS6操作系統的主機
盜鏈服務器的IP爲192.168.16.133 域名www.test.com
被盜鏈服務器爲192.168.16.130 域名www.fz.com
一臺win7客戶端用來測試,IP爲192.168.16.128
最終達到的效果是,www.fz.com站點成功防盜鏈,而且將客戶端請求的URL重寫爲http://summer.fz.com/123.jpg,成功防止盜鏈行爲。
1.盜鏈服務器的配置
(1)查看Linux服務器版本
[root@nginx ~]# cat /etc/redhat-release CentOS release 6.7 (Final) [root@nginx ~]# uname -r 2.6.32-573.el6.x86_64
(2)然後我提前編譯安裝好了Nginx服務,這是nginx版本
[root@nginx ~]# nginx -v nginx version: nginx/1.11.5
(3)編輯nginx配置文件,創建一個測試的站點
server { server標籤 listen 80; 偵聽80端口 server_name www.test.com; 域名爲www.test.com location / { location塊 root /var/html/test; 網站根目錄在/var/html/test index index.html index.htm; index首頁 access_log logs/test_access.log; 訪問日誌路徑 error_log logs/test_error.log; 錯誤日誌路徑 }
(4)檢測語法,平滑重啓
[root@nginx test]# nginx -t 檢測語法,是否有錯誤 nginx: the configuration file /application/nginx-1.10.1/conf/nginx.conf syntax is ok nginx: configuration file /application/nginx-1.10.1/conf/nginx.conf test is successful [root@nginx test]# nginx -s reload 平滑重啓
2.被盜鏈服務器的配置
(1)查看Linux版本
[root@LNMP ~]# cat /etc/redhat-release CentOS release 6.7 (Final) [root@LNMP ~]# uname -r 2.6.32-573.el6.x86_64
(2)然後我也是提前編譯安裝好了Nginx服務,這是nginx版本
[root@LNMP ~]# nginx -v nginx version: nginx/1.10.1
(3)編輯nginx配置文件,創建一個測試的站點
server { listen 80; server_name www.fz.com; root /var/html/fz; access_log logs/fz_access.log; error_log logs/fz_error.log; }
(4)檢測語法,平滑重啓
[root@LNMP conf]# nginx -t nginx: the configuration file /application/nginx-1.10.1/conf/nginx.conf syntax is ok nginx: configuration file /application/nginx-1.10.1/conf/nginx.conf test is successful [root@LNMP conf]# nginx -s reload
3.現在基本都搭建好,現在www.test.com站點服務器上添加一個html文件
(1)echo雙引號的內容的意思是,當客戶端訪問自身服務器的www.test.com圖片資源時,由於沒有圖片提供給客戶端,將圖片資源鏈接到www.fz.com上,從而返回給客戶端。
[root@nginx conf]# cd /var/html/test/ [root@nginx test]# echo "<img src = "http://www.fz.com/p_w_picpaths/blog-img1.jpg">" > index.html
客戶端用瀏覽器訪問www.test.com,返回的是www.fz.com上 圖片資源 ,盜鏈成功
可以看到Referer的頭域的值來自www.test.com
(2)根據文件類型實現防盜鏈的配置實例
在www.fz.com服務器上編輯nginx.conf配置文件
28 server { 29 listen 80; 30 server_name www.fz.com; 31 root /var/html/fz; 32 location ~ .*\.(gif|jpg|png|flv|swf|rar|zip)$ 33 { 34 valid_referers fz.com *.fz.com; 35 if ($invalid_referer) 36 { 37 rewrite ^/ http://summer.fz.com/123.jpg; 38 } 39 } 40 } 41 server { 42 listen 80; 43 server_name summer.fz.com; 44 root /var/html/time; 46 } 47 }
在配置中,32行當有網絡連接對以gid、jpg、png爲後綴的圖片資源、以flv、swf爲後綴的媒體資源以rar、zip爲後綴的壓縮存檔資源發起請求時,34行如果檢測到Referer頭域中沒有符合valid_referers指令配置的值,就將客戶端請求 URL重寫爲http://summer.fz.com/123.jpg。
爲什麼還要一個server標籤,這是有原因的,當時自己看書看博文學習做實驗的時候,發現一直跳轉不到想要的結果,而是一個空白頁面,幾經周折,在51的博文無意發現關於Nginx防盜鏈的一段話,就是37行的rewrite ^/ http://summer.fz.com/123.jpg
這個圖片是盜鏈返回的圖片,也就是替換盜鏈網站所有盜鏈的圖片。這個圖片要放在沒有設置防盜鏈的網站上,因爲防盜鏈的作用,這個圖片如果也放在防盜鏈網站上就會被當作防盜鏈顯示不出來了,盜鏈者的網站所盜鏈圖片會顯示X符號。
所以爲了達到自己期待效果,新建一個server標籤,讓URL重寫到該站點下的圖片。
最後,我用客戶端再次訪問www.test.com,看看結果怎樣?
可以看到請求頭信息和原始頭信息,因爲www.fz.com做了防盜鏈,只要不是以*.fz.com域名的訪問,都轉到summer.fz.com/123.jpg去。
最後補充一下,這只是個人的做法,以供參考,那個畫圖IP地址是練習用的,公網上不能用私有地址的啦。
謝謝各位,成功那刻,心裏美滋滋的。