一.原理html
二.配置指令nginx
三.實例配置瀏覽器
盜鏈是一種損害原有網站合法利益,給原網站所在服務器形成額外負擔的非法行爲。要採起防盜鏈的措施,首先須要瞭解盜鏈的實現原理。 客戶端向服務器請求資源時,爲了減小網絡帶寬,提升響應時間,服務器通常不會一次將全部資源完整地傳回給客戶端。好比在請求一個網頁時,首先會傳回該網頁的文本內容,當客戶端瀏覽器在解析文本的過程當中發現有圖片存在時,會再次向服務器發起對該圖片資源的請求,服務器將存儲的圖片資源再發送給客戶端。在這個過程當中,若是該服務器上只包含了網頁的文本內容,並無存儲相關的圖片資源,而是將圖片資源連接到其餘站點的服務器上去了,這就造成了盜鏈行爲。服務器
好比內網用戶經過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上 圖片資源 ,盜鏈成功
能夠看到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地址是練習用的,公網上不能用私有地址的啦。
謝謝各位,成功那刻,內心美滋滋的。