Nginx服務之防盜鏈功能

Nginx防盜鏈

一.原理html

二.配置指令nginx

三.實例配置瀏覽器

一.原理

盜鏈是一種損害原有網站合法利益,給原網站所在服務器形成額外負擔的非法行爲。要採起防盜鏈的措施,首先須要瞭解盜鏈的實現原理。 客戶端向服務器請求資源時,爲了減小網絡帶寬,提升響應時間,服務器通常不會一次將全部資源完整地傳回給客戶端。好比在請求一個網頁時,首先會傳回該網頁的文本內容,當客戶端瀏覽器在解析文本的過程當中發現有圖片存在時,會再次向服務器發起對該圖片資源的請求,服務器將存儲的圖片資源再發送給客戶端。在這個過程當中,若是該服務器上只包含了網頁的文本內容,並無存儲相關的圖片資源,而是將圖片資源連接到其餘站點的服務器上去了,這就造成了盜鏈行爲。服務器

wKioL1gsBdbTaORsAAEfiXw75v4402.png-wh_50

好比內網用戶經過Internet訪問域名爲www.test.com這個服務器上的WEB服務,而該服務器沒有存儲圖片資源,而是將圖片連接到域名爲www.fz.com服務器上,這就造成了盜鏈行爲。這種狀況下客戶端請求 圖片資源其實是來自其餘的服務器。網絡

要實現防盜鏈,須要瞭解HTTP協議中的請求頭部的Referer頭域和採用URL的格式表示訪問當前網頁或者文件的源地址。經過該頭域的值,咱們能夠檢測到訪問目標資源的源地址。這樣,若是咱們檢測到Referer頭域中的值並非本身站點內的URL,就採起組織措施,實現防盜鏈。app

須要注意是,因爲Referer頭域中的值能夠被更改的,所以該方法不能徹底阻止全部盜鏈行爲。ide


二.配置指令

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上 圖片資源 ,盜鏈成功

wKiom1gsGoqgo8BMAACRqPvt55k279.png-wh_50

能夠看到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,看看結果怎樣?

wKioL1gsIqnC5d0EAACSqgEIhcs005.png-wh_50


能夠看到請求頭信息和原始頭信息,由於www.fz.com作了防盜鏈,只要不是以*.fz.com域名的訪問,都轉到summer.fz.com/123.jpg去。


最後補充一下,這只是我的的作法,以供參考,那個畫圖IP地址是練習用的,公網上不能用私有地址的啦。

謝謝各位,成功那刻,內心美滋滋的。

相關文章
相關標籤/搜索