你們在訪問網站的時候,常常會看到圖片展現不出來的時候,以下圖php
你們有沒有想過這是爲何嘛?其實這是一種簡單的防盜鏈的處理,那麼盜鏈是什麼呢?爲何須要防呢?我們今天來一塊兒揭開它神祕的面紗。nginx
盜鏈是指在本身的頁面上展現一些並不在本身服務器上的一些內容, 獲取別人的資源地址,繞過別人的資源展現頁面,直接在本身的頁面上向最終用戶提供此內容。 通常被盜鏈的都是圖片、 音樂、視頻、軟件等資源。經過盜鏈的手段能夠減輕本身服務器的負擔瀏覽器
好比我直接在本身的網站上服務器
![](http:www.baidu.com/imagepath/image.png)
這樣就能夠直接展現百度的圖片,可是其實是沒法展現的(以下圖),之因此沒法展現是由於百度的圖片作過防盜鏈處理網站
經過Refer或者簽名,網站能夠檢測目標網頁訪問的來源網頁,若是是資源文件,則能夠追蹤到顯示他的網頁地址 一旦檢測到來源不是本站,即進行阻止或者返回指定的頁面加密
Nginx模塊,
ngx_http_referer_module用於阻擋來源非法域名的請求 nginx指令valid_refers,全局變量$invalid_refer
對資源的防盜鏈nginx配置爲spa
location ~.*\.(gif|jpg|png|flv|swf|rar|zip)$ { valid_referers none blocked test.com *.test.com; //加none的目的是確保瀏覽器能夠直接訪問資源 if($invalid_referer) { #return 403; // 直接返回403 rewrite ^/ http://www.test.com/403.jpg;//返回指定提示圖片 } }
對目錄的防盜鏈nginx配置爲code
location /images/ { valid_referers none blocked test.com *.test.com; if($invalid_referer) { #return 403; rewrite ^/ http://www.test.com/403.jpg; }
可是傳統的防盜鏈也會存在一些問題,由於refer是能夠僞造的, 因此可使用加密簽名的方式來解決這個問題。 什麼是加密簽名?就是當咱們請求一個圖片的時候,我要給他帶一些簽名過去,而後返回圖片的時候咱們判斷下簽名是否正確,至關於對一個暗號。視頻
可使用第三方模塊HttpAccessKeyModule來解決防盜鏈的問題,咱們須要去安裝。圖片
安裝好有這樣一個指令:
accesskey on|off 模塊開關
accesskey_hashmethod md5 | sha-1 簽名加密方式
accesskey_arg GET參數名稱
accesskey_signature 加密規則
location ~.*\.(gif|jpg|png|flv|swf|rar|zip)$ { accesskey on; accesskey_hashmethod md5; accesskey_arg sign; accesskey_signature "mypass$remote_addr"; }
意思是mypass加客戶端ip經過md5加密 圖片文件代碼:
<?php $sign = md5('mypass' . $_SERVER['REMOTE_ADDR']); echo '![](./photo.jpg?sign=)'; ?>
以上就是防盜鏈的兩種形式,歡迎夥伴們進行討論留言。