Nginx、Apache和IIS的防盜鏈設(shè)置
盜鏈是指自己網(wǎng)站的圖片和視頻等資源,被其他網(wǎng)站引用,可能會導(dǎo)致自己網(wǎng)站的流量異常過高。本文講述Nginx、Apache和IIS的防盜鏈設(shè)置,用以下措施可以防止盜鏈問題。在防盜鏈情況下,直接發(fā)自己網(wǎng)站的圖片或視頻鏈接給客戶,客戶是無法直接訪問的,
只有正常訪問網(wǎng)站才能顯示相關(guān)圖片和視頻。請結(jié)合自己的業(yè)務(wù)需求使用。
Nginx 防盜鏈設(shè)置
Nginx 設(shè)置防盜鏈(Hotlink Protection)是一個非常常見且有用的功能,它可以防止其他網(wǎng)站直接鏈接到你的圖片、視頻、CSS、JS 等靜態(tài)資源,從而盜用你的服務(wù)器帶寬和流量。
Nginx 主要通過內(nèi)置的 ngx_http_referer_module 模塊來實現(xiàn)防盜鏈功能,其核心原理是檢查 HTTP 請求頭中的 Referer 字段。
以下是一些常見的配置場景,你通常需要在 server 或 location 塊中添加這些配置。
Nginx 防盜鏈場景一:基本防盜鏈(保護所有圖片格式),這個配置只允許來自你自己域名和空 Referer 的請求訪問圖片。
server {
listen 80;
server_name yourdomain.com;
# 圖片緩存設(shè)置
location ~* \.(jpg|jpeg|png|gif|webp|bmp)$ {
# 定義有效的Referer來源
valid_referers none blocked yourdomain.com *.yourdomain.com;
# 如果Referer不在有效列表里,$invalid_referer為1,則執(zhí)行后面的操作
if ($invalid_referer) {
# 可以返回403錯誤
return 403;
# 或者重寫為一個防盜鏈提示圖片
# rewrite ^ /path/to/anti-hotlink-image.jpg;
}
# 正常情況下的設(shè)置,如設(shè)置緩存時間、過期頭等
expires 30d;
add_header Cache-Control "public";
}
}Nginx 防盜鏈場景二:更靈活的設(shè)置(允許特定合作伙伴)
如果你希望允許一些友好的網(wǎng)站或搜索引擎(如 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 防盜鏈場景三:使用正則表達式匹配更復(fù)雜的域名
對于更復(fù)雜的匹配需求,可以使用正則表達式(以 ~ 開頭)。
location ~* \.(jpg|jpeg|png|gif|webp|bmp)$ {
# 使用正則匹配所有以 "yourdomain.com" 結(jié)尾的域名
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防止重寫規(guī)則被再次處理
}
# ... 其他配置 ...
}
# 單獨為這個提示圖片設(shè)置一個location,避免它自己也被防盜鏈規(guī)則攔截
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參數(shù)
secure_link $arg_md5,$arg_expires;
# 設(shè)置生成令牌時使用的密鑰,必須與生成鏈接的程序使用的密鑰一致
secure_link_md5 "your_secret_key$secure_link_expires$uri";
# 如果令牌無效
if ($secure_link = "") {
return 403; # 令牌錯誤或缺失
}
# 如果令牌有效但鏈接已過期
if ($secure_link = "0") {
return 410; # Gone,表示資源已過期
}
# ... 正常服務(wù)資源 ...
}這種方式需要你在程序端(如 PHP、Python、Node.js)動態(tài)生成帶令牌的鏈接,配置相對復(fù)雜,但安全性極高。
配置完成后,一定要用 nginx -t 測試配置語法是否正確,然后用 nginx -s reload 重載配置。
測試方法:
在你自己的網(wǎng)站頁面里查看圖片,應(yīng)該正常顯示。
直接在瀏覽器地址欄輸入圖片鏈接,應(yīng)該正常顯示(因為 Referer 為空,none 允許)。
使用 curl 命令模擬盜鏈:curl -e "http://illegal-site.com" http://yourdomain.com/your-image.jpg,應(yīng)該返回 403 或你設(shè)置的提示圖片。
允許空 Referer:none 選項很重要。如果不加 none,用戶直接輸入鏈接、從郵件或即時通訊工具點擊鏈接時,Referer 也為空,也會被攔截,影響正常用戶體驗。
性能:正則表達式雖然強大,但比普通字符串匹配更耗性能,請謹慎使用。
Apache防盜鏈設(shè)置
規(guī)則文件.htaccess(手工創(chuàng)建.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是被盜鏈后的提示內(nèi)容文件
IIS防盜鏈設(shè)置
Windows2008、2012或更高系統(tǒng)下規(guī)則文件web.config (手工創(chuàng)建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的數(shù)據(jù)庫導(dǎo)入到mysql5.7
下一篇:IIS下強制https訪問的設(shè)置
- 在 IIS 服務(wù)上部署 SSL 證書后訪問資源出現(xiàn)404錯誤
- 網(wǎng)站安全:IIS基于并發(fā)請求數(shù)阻止 IP 地址
- Windows服務(wù)器下隱藏IIS版本號
- IIS下的.net網(wǎng)站安全掃描提示:Strict-Transport-Security 請求頭配置錯誤
- IIS下的.net網(wǎng)站:加密會話(SSL)Cookie中缺少secure屬性
- 網(wǎng)站安全設(shè)置:會話cookie中缺少HttpOnly屬性的修復(fù)
- IIS下強制https訪問的設(shè)置
- Nginx、Apache和IIS的防盜鏈設(shè)置
- 網(wǎng)站設(shè)計制作:頁面中如何通過css讓元素水平居中
- 網(wǎng)站服務(wù)器:隱藏IIS的server版本信息
