Nginx如何實現(xiàn)網(wǎng)站圖片和文件下載的防盜鏈
當(dāng)前位置:點晴教程→知識管理交流
→『 技術(shù)文檔交流 』
什么是防盜鏈? 舉個例子來說,有兩個網(wǎng)站,A網(wǎng)站想使用B網(wǎng)站的圖片,第一種方法是在A網(wǎng)站中直接添加B網(wǎng)站的圖片鏈接,第二種是將B網(wǎng)站的圖片下載回來,然后上傳到A網(wǎng)站中使用,此時,如果B網(wǎng)站不想讓A網(wǎng)站繼續(xù)使用此圖片了,可以通過添加一些限制來阻止A網(wǎng)站使用,這個阻止措施就是防盜鏈,添加了防盜鏈后,A網(wǎng)站再次使用通過URL請求B網(wǎng)站圖片的時候,就會提示錯誤信息或者其他內(nèi)容,從而保護了原圖片,下面演示如何配置防盜鏈 環(huán)境準備:
1、首先配置server1服務(wù)器,讓Nginx請求一個圖片,配置如下: 在nginx根目錄下創(chuàng)建文件夾image,在下面放一個1.png文件,訪問www.server1.com/image/1.png,如下: 2、配置server2服務(wù)器,修改Nginx默認頁面index.html,添加server1的圖片URL,如圖: 訪問頁面,可以看到server1的圖片已經(jīng)加載出來,如圖:
防盜鏈配置 Nginx中實現(xiàn)防盜鏈的配置主要有兩個模塊:
refer模塊 refer模塊原理是: 如果網(wǎng)站盜用了你的圖片,那么用戶在點擊或者查看這個盜鏈內(nèi)容時,發(fā)送 http 請求的頭部中的 referer 字段將為該盜版網(wǎng)站的 url。此時我們通過獲取這個頭部信息,獲取http 發(fā)起請求的頁面,然后判斷這個地址是否是我們的合法頁面,不是則判斷為盜鏈 referer中比較重要的指令就是valid_referers,它后面可以攜帶多個參數(shù),表示多個referer頭都是有效的,語法如下:
主要參數(shù)有:
Nginx 會通過查看 referer 字段和 valid_referers 后面的 referer 列表進行匹配,如果匹配到了就將內(nèi)置的變量$invalid_referer值設(shè)置為0,否則設(shè)置該值為1,匹配的過程不區(qū)分大小寫 1、下面在server1服務(wù)器的Nginx配置防盜鏈設(shè)置,如圖:
2、再次通過server2域名來請求頁面,可以看到圖片已經(jīng)無法加載,如圖: 注意:可靈活使用none、blocker等參數(shù) secure_link模塊 通過 referer 頭部值的防盜鏈方法過于脆弱,盜用者很容易通過偽造 referer 的值輕而易舉跳過防盜措施,在 Nginx 中有一種更為高級的防盜方式,即基于 secure_link 模塊,該模塊能夠檢查請求鏈接的權(quán)限以及是否過期,多用于下載服務(wù)器防盜鏈。這個模塊默認未編譯進 Nginx,需要在源碼編譯時候添加--with-http_secure_link_module即可安裝成功 該模塊的通過驗證 URL 中的哈希值的方式防盜鏈。它的防盜過程如下:
通過配置 secure_link, secure_link_md5 指令,可實現(xiàn)對鏈接進行權(quán)限以及過期檢查判斷的功能,secure_link 模塊的值有如下三種情況:
通常使用這個模塊進行 URL 校驗,那么如何生成合法的URL以及在Nginx中如何配置來校驗這個URL呢? 生成合法的 URL 和 指令 secure_link_md5 有關(guān),例如:
如果Nginx中的secure_link_md5 是上述配置,那么生成合法的URL命令如下:
通過上述命令得到一個md5的值:YfagRTs8J-soGzU0_Whd1g,這個值很重要,接下來構(gòu)造URL和指令secure_link有關(guān),如果 secure_link 指令的配置如下:
那么請求的url中必須帶上md5和expires參數(shù)才能正常訪問,例如:
環(huán)境準備:
1、首先在server2服務(wù)器配置Nginx,訪問圖片路徑,如圖: 在/usr/local/nginx/image下上傳1.png,然后通過http://www.server2.com/1.png請求,如圖: 2、繼續(xù)修改server2服務(wù)器的Nginx配置,添加防盜鏈配置,如圖: 從上圖看出,我們自定義的是校驗不通過的時候返回狀態(tài)碼405,現(xiàn)在我們再次請求下圖片,如圖: 返回405,說明防盜鏈規(guī)則已經(jīng)生效,上面已經(jīng)提過,如果要實現(xiàn)正常請求,需要在請求參數(shù)中攜帶md5和expires參數(shù)才可以,定義md5和expires的方法如下: (1)、定義過期時間,這里使用shell演示,如下:
(2)、使用過期時間生成md5,如下:
注:secret_key需要與Nginx中配置的secret_key保持一致,否則請求不到資源 (3)、接下來使用url+md5+expires請求,即可正常訪問了,如下:
注意:在實際使用中,過期時間和 md5是需要通過開發(fā)代碼來生成,因此,無論哪里需要請求這個資源,都需要md5和expires參數(shù)才能正常請求 閱讀原文:原文鏈接 該文章在 2025/7/1 23:19:44 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |