1.什麼是資源盜鍊
簡單地說,就是将别人的資源用到自己的頁面展示給使用者。
2.效果示範
1)準備圖檔
這兩張圖檔直接在浏覽器中通路都是可以打開的。
github圖檔位址:https://github.githubassets.com/images/modules/site/home-campaign/hero-drone.webp
豆瓣圖檔位址:https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2889598060.webp
2)html準備
cd /usr/local/nginx/html
touch test.html
test.html
<!DOCTYPE html>
<html>
<body>
<img src="https://github.githubassets.com/images/modules/site/home-campaign/hero-drone.webp"/>
<br/ >
<img src="https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2889598060.webp" alt="douban">
</body>
</html>
展示效果:通路http://192.168.110.98/test.html
檢視控制台:
說明douban的圖檔資源做了防盜鍊處理。
那麼我們自己的資源如何做防盜鍊處理呢?
3.資源防盜鍊
關于資源防盜鍊,我們需要先了解一個概念,那就是請求頭中的Referer字段資訊,當浏覽器向web伺服器發送請求的時候,一般會帶上Referer,告訴伺服器我是從那個頁面過來的,web伺服器根據這個資訊進行一些處理,資源防盜鍊的處理也是根據該字段資訊進行相應處理。
Tips:請求頭的Referer字段資訊是可以通過程式僞裝生成的,是以根據Referer資訊來實作防盜鍊并非100%可靠,但是,它能夠限制大部分的盜鍊。
1)準備資源
test.jfif圖檔:
2)将資源放到nginx伺服器的/usr/local/nginx/html檔案夾
3)準備test.html頁面
<!DOCTYPE html>
<html>
<body>
<img src="./test.jfif" alt="test">
</body>
</html>
4)通路頁面:http://192.168.110.98/test.html
可以看到,目前的我們的資源是可以正常通路的,接下來,我們将做一些防盜鍊的措施。
我們知道web伺服器是根據請求頭的Referer字段值來判斷請求是從哪個頁面發送過來的,nginx提供了ngx_http_referer_module子產品,來對該資訊進行處理。
下面我們來看看相關文法:
作用域:server, location
文法:valid_referers none | blocked | server_names | string ...;
1)valid_referers none;
表示請求頭中不存在Referer字段。
2)valid_referers blocked;
表示請求頭中存在Referer字段,且其值不以http://或https://開頭
3)valid_referers server_names;
表示請求頭中存在Referer字段,且其值包含nginx配置檔案中server_name的其中一個
4)任意字元串
表示請求頭中存在Referer字段,且定義了伺服器名稱和可選的URI字首。伺服器名稱的開頭或結尾可以有一個“*”。在檢查過程中,“Referer”字段中的伺服器端口被忽略;
5)正規表達式
表示請求頭中存在Referer字段,且第一個符号應該是“~”。需要注意的是,表達式将從http://或https://之後開始的文本相比對。
示例:
valid_referers none blocked server_names *.example.com test.example.* ~\.example\.com
除了使用valid_referers指令外,我們還需要用到一個變量$invalid_referer,如果“Referer”請求标頭字段值被認為有效,則為空字元串,否則為“1”。
5)配置資源防盜鍊
因為我們現在要通路test.gfif圖檔,是以我們如下配置:
location ~^/.*\.(png|jpg|gif|jfif) {
valid_referers www.example.com;
if ($invalid_referer){
return 403;
}
root html;
}
Tips:正規表達式必須以~開頭。
這個時候我們再來通路http://192.168.110.98/test.html,顯示無法通路。
我們檢視其請求頭的Referer字段:Referer:http://192.168.110.98/test.html,是以被拒絕通路了。
以上就是Nginx配置靜态資源防盜鍊,Nginx是多子產品化的,還有很多進階功能,我們後面繼續探索。