Nginx、Apache和IIS的防盜鏈設置
盜鏈是指自己網站的圖片和視頻等資源,被其他網站引用,可能會導致自己網站的流量異常過高。本文講述Nginx、Apache和IIS的防盜鏈設置,用以下措施可以防止盜鏈問題。在防盜鏈情況下,直接發自己網站的圖片或視頻鏈接給客戶,客戶是無法直接訪問的,
只有正常訪問網站才能顯示相關圖片和視頻。請結合自己的業務需求使用。
Nginx 防盜鏈設置
Nginx 設置防盜鏈(Hotlink Protection)是一個非常常見且有用的功能,它可以防止其他網站直接鏈接到你的圖片、視頻、CSS、JS 等靜態資源,從而盜用你的服務器帶寬和流量。
Nginx 主要通過內置的 ngx_http_referer_module 模塊來實現防盜鏈功能,其核心原理是檢查 HTTP 請求頭中的 Referer 字段。
以下是一些常見的配置場景,你通常需要在 server 或 location 塊中添加這些配置。
Nginx 防盜鏈場景一:基本防盜鏈(保護所有圖片格式),這個配置只允許來自你自己域名和空 Referer 的請求訪問圖片。
server { listen 80; server_name yourdomain.com; # 圖片緩存設置 location ~* \.(jpg|jpeg|png|gif|webp|bmp)$ { # 定義有效的Referer來源 valid_referers none blocked yourdomain.com *.yourdomain.com; # 如果Referer不在有效列表里,$invalid_referer為1,則執行后面的操作 if ($invalid_referer) { # 可以返回403錯誤 return 403; # 或者重寫為一個防盜鏈提示圖片 # rewrite ^ /path/to/anti-hotlink-image.jpg; } # 正常情況下的設置,如設置緩存時間、過期頭等 expires 30d; add_header Cache-Control "public"; } }
Nginx 防盜鏈場景二:更靈活的設置(允許特定合作伙伴)
如果你希望允許一些友好的網站或搜索引擎(如 Google、Baidu)引用你的圖片,可以添加他們的域名。
location ~* \.(jpg|jpeg|png|gif|webp|bmp)$ { valid_referers none blocked yourdomain.com *.yourdomain.com google.com *.google.com baidu.com *.baidu.com; if ($invalid_referer) { return 403; } # ... 其他配置 ... }
Nginx 防盜鏈場景三:使用正則表達式匹配更復雜的域名
對于更復雜的匹配需求,可以使用正則表達式(以 ~ 開頭)。
location ~* \.(jpg|jpeg|png|gif|webp|bmp)$ { # 使用正則匹配所有以 "yourdomain.com" 結尾的域名 valid_referers none blocked ~\.yourdomain\.com$ ~\.google\.; if ($invalid_referer) { return 403; } # ... 其他配置 ... }
Nginx 防盜鏈場景四:返回一張防盜鏈提示圖片
與其返回冷冰冰的 403 錯誤,不如重寫請求,返回一張有趣的“請勿盜鏈”提示圖片,體驗更好。
location ~* \.(jpg|jpeg|png|gif|webp|bmp)$ { valid_referers none blocked yourdomain.com *.yourdomain.com; if ($invalid_referer) { # 將所有盜鏈請求重寫到一個本地圖片 rewrite ^ /images/anti-hotlink.jpg; break; # 重要:使用break防止重寫規則被再次處理 } # ... 其他配置 ... } # 單獨為這個提示圖片設置一個location,避免它自己也被防盜鏈規則攔截 location = /images/anti-hotlink.jpg { expires 0; # 不緩存,每次都重新請求 add_header Cache-Control "no-cache"; # 確保這個圖片路徑確實存在 }
Nginx 防盜鏈更安全的方案:使用 Secure Link 模塊 (可選)
Referer 檢查的方式非常方便,但可以被偽造。對于安全性要求極高的場景,Nginx 提供了更強大的 ngx_http_secure_link_module 模塊。
這種方式會為每個資源鏈接生成一個帶過期時間和哈希校驗令牌的URL。如果令牌無效或鏈接已過期,訪問將被拒絕。
location /downloads/ { # 從URL中獲取secure_link和expires參數 secure_link $arg_md5,$arg_expires; # 設置生成令牌時使用的密鑰,必須與生成鏈接的程序使用的密鑰一致 secure_link_md5 "your_secret_key$secure_link_expires$uri"; # 如果令牌無效 if ($secure_link = "") { return 403; # 令牌錯誤或缺失 } # 如果令牌有效但鏈接已過期 if ($secure_link = "0") { return 410; # Gone,表示資源已過期 } # ... 正常服務資源 ... }
這種方式需要你在程序端(如 PHP、Python、Node.js)動態生成帶令牌的鏈接,配置相對復雜,但安全性極高。
配置完成后,一定要用 nginx -t 測試配置語法是否正確,然后用 nginx -s reload 重載配置。
測試方法:
在你自己的網站頁面里查看圖片,應該正常顯示。
直接在瀏覽器地址欄輸入圖片鏈接,應該正常顯示(因為 Referer 為空,none 允許)。
使用 curl 命令模擬盜鏈:curl -e "http://illegal-site.com" http://yourdomain.com/your-image.jpg,應該返回 403 或你設置的提示圖片。
允許空 Referer:none 選項很重要。如果不加 none,用戶直接輸入鏈接、從郵件或即時通訊工具點擊鏈接時,Referer 也為空,也會被攔截,影響正常用戶體驗。
性能:正則表達式雖然強大,但比普通字符串匹配更耗性能,請謹慎使用。
Apache防盜鏈設置
規則文件.htaccess(手工創建.htaccess文件到站點根目錄)
<IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{HTTP_REFERER} !baidu.com [NC] RewriteCond %{HTTP_REFERER} !google.com [NC] RewriteCond %{HTTP_REFERER} !xxx.net [NC] #RewriteCond %{HTTP_REFERER} ^$ [NC] RewriteRule .*\.(jpg|jpeg|png|gif|bmp|swf|mp4|zip|rar|pdf|webp|js|css)$ /band.txt [NC,L] </IfModule>
注:xxx.net是您自己的域名,band.txt是被盜鏈后的提示內容文件
IIS防盜鏈設置
Windows2008、2012或更高系統下規則文件web.config (手工創建web.config文件到站點根目錄)
<?xml version="1.0" ?> <configuration> <system.webServer> <rewrite> <rules> <rule name="rule1" stopProcessing="true"> <match url="^.*\.(jpg|jpeg|png|gif|bmp|swf|mp4|zip|rar|pdf|webp|js|css)$" ignoreCase="true" /> <conditions logicalGrouping="MatchAny" > <add input="{HTTP_REFERER}" pattern="您的域名.com(不用加www)" negate="true" /> <!--<add input="{HTTP_REFERER}" pattern="^$" />--> </conditions> <action type="AbortRequest" /> </rule> </rules> </rewrite> </system.webServer> </configuration>
上一篇:mysql8.0的數據庫導入到mysql5.7
下一篇:IIS下強制https訪問的設置