為什么要配置防盜鏈
-
A是某一網站站長,A網站中的圖片和音頻視頻鏈接等靜態資源都保存在對象存儲OSS上或者本地。
-
B是另一網站的站長,B在未經A允許的情況下使用A網站的圖片資源,放置在自己網站的網頁中,通過這種方法盜取
空間和流量
。這樣的情況下,第三方網站用戶看到的是B網站,但並不清楚網站里的圖片來源。
- OSS是收費的,這樣用戶A在沒有獲取任何收益的情況下,反而承擔了資源使用費用,並且B在沒有經過允許的情況下適用這些資源也是侵害了A的合法權益。
綜上,為了防止B這一類人的不法侵害,需要使用防盜鏈進行防護
配置防盜鏈的方法
要實現防盜鏈,需要了解HTTP協議中的請求頭部的Referer頭域
和采用URL的格式表示訪問當前網頁或者文件的源地址。通過該頭域的值,我們可以檢測到訪問目標資源的源地址。這樣,如果我們檢測到Referer頭域
中的值並不是自己站點內的URL,就采取阻止措施,實現防盜鏈。
Nginx的valid_referers可以配置相關防盜鏈的行為
**Syntax: valid_referers none | blocked | server_names | string ...; Default: — Context: server, location #搜索匹配不區分大小寫 Parameters can be as follows: none #檢測Referer頭域不存在的請求 blocked #檢測Referer頭域的值被防火牆或者代理服務器刪除或偽裝的情況,這種情況頭域不以http:// https:// 開頭 server_names #設置一個或多個URL,檢測Referer頭域的值是否是這些URL中的某個 arbitrary string #定義一個服務器名稱和一個可選的URI前綴。服務器名可以在開頭或結尾有“*”。檢查時,“Referer”字段中的服務器端口被忽略
這些語法含義指的是,valid_referers配置白名單對請求的頭域進行匹配,匹配的值就是$invalid_referer
,根據獲得的這個值,進行if
條件判斷,然后進行rewrite。
示例
#匹配文件類型 location ~* \.(gif|jpg|png|jpeg|flv|swf|rar|zip)$ { expires 30d; #允許文件鏈出的域名白名單,域名之間空格隔開 valid_referers none blocke *.A.com www.A.com; #if判斷為真 if ($invalid_referer) { #防盜鏈圖片替換所有盜鏈圖片 rewrite ^/ http://www.A.com/404.jpg; } }
- 為了徹底實現真正的防盜鏈,可以將
none、blocked
刪除 - 防盜鏈返回圖片可以
rewrite
成圖片,也可以是鏈接
完成防盜鏈配置,可以在請求頭里面看到Host頭的指向,會只看到A.com。