深度Referer防盗链需精准识别来源,放行空Referer、本站及子域请求,拦截非法外站;Apache用SetEnvIfNoCase多条件匹配,Nginx用valid_referers增强覆盖,须测试空Referer、盗链模拟与HTTPS降级场景。
直接在虚拟主机配置中实现referer防盗链深度检测,核心是精准识别请求来源、区分合法与非法 referer,并覆盖常见绕过场景(如空 referer、协议差异、子域名、通配匹配等)。它不是简单加一行规则,而是结合逻辑判断、多条件容错和防御优先级来落地。
明确检测目标与关键边界情况
深度检测不是只拦“外站”,而是要同时满足三类访问需求:
- 用户直接在浏览器地址栏输入资源 URL(Referer 为空)——必须放行
- 本站在页面内加载图片、JS、CSS 等资源(Referer 为 https://your-site.com 或 https://sub.your-site.com)——必须放行
- 第三方网站嵌入你的图片或视频(Referer 为 https://bad-site.net 或伪造的 http://your-site.com)——必须拦截
特别注意:HTTPS 页面引用 HTTP 资源时,浏览器会清空 Referer;某些隐私模式或代理也会导致 Referer 为 blocked;大小写、末尾斜杠、端口号、查询参数都可能影响匹配结果。
Apache 虚拟主机中的深度 Referer 配置
在 httpd-vhosts.conf 的 <virtualhost></virtualhost> 块内,使用 SetEnvIfNoCase + <filesmatch></filesmatch> 组合,支持正则、忽略大小写、多域名白名单:
<virtualhost> ServerName your-site.com DocumentRoot "/var/www/html" <h1>定义合法 Referer:支持 www/非www、HTTP/HTTPS、主域/子域、空 Referer</h1> <p>SetEnvIfNoCase Referer "^$" allowed_referer SetEnvIfNoCase Referer "^https?://(www.)?your-site.com(:[0-9]+)?(/|$)" allowed_referer SetEnvIfNoCase Referer "^https?://([a-z0-9-]+.)?your-site.com(:[0-9]+)?(/|$)" allowed_referer</p> <h1>可选:显式拒绝已知盗链域名(黑名单优先)</h1> <p>SetEnvIfNoCase Referer "bad1.com|evil-site.org|steal.net" denied_referer</p> <p><filesmatch> Order Deny,Allow Deny from all Allow from env=allowed_referer Deny from env=denied_referer </filesmatch></p></virtualhost>
✅ 优势:支持正则分组、端口捕获、协议可选;Deny from env=xxx 优先级高于 Allow,确保黑名单生效。
Nginx 虚拟主机(server 块)中的深度检测写法
Nginx 使用 valid_referers 指令更简洁,但需手动覆盖边界。以下为增强版配置:
server {
listen 80;
server_name your-site.com www.your-site.com;
<h1>允许:空 Referer、blocked(被浏览器/插件过滤)、主域、所有子域、含端口或路径的合法来源</h1><p>valid_referers
none
blocked
your-site.com
www.your-site.com
~.your-site.com
~^https?://[^/]*.your-site.com(:[0-9]+)?(/|$);</p><p>location ~* .(jpg|jpeg|png|gif|webp|mp4|pdf|zip|js|css)$ {
if ($invalid_referer) {</p><h1>拦截前可记录日志辅助分析</h1><pre class="brush:php;toolbar:false;"> access_log /var/log/nginx/referer_deny.log main;
return 403;
# 或重定向到默认提示图:rewrite ^(.*)$ /static/blocked.png break;
}
# 正常静态文件服务
root /var/www/html;} }
⚠️ 注意:~\. 匹配任意子域名(如 api.your-site.com),~^https?:// 支持协议灵活匹配;none 和 blocked 必须显式保留,否则直接访问会 403。
验证与防绕过要点
仅配置不测试等于没做。建议用以下方式交叉验证:
- curl 测试空 Referer:
curl -I http://your-site.com/image.jpg→ 应返回 200 - curl 模拟盗链:
curl -e "https://evil.com/test.html" -I http://your-site.com/image.jpg→ 应返回 403 - 浏览器开发者工具 Network 标签页,查看真实请求的 Referer 值是否与预期一致
- 检查 HTTPS 页面引用 HTTP 资源时是否被误杀(可临时开启
Referrer-Policy: no-referrer-when-downgrade头辅助定位) - 日志中持续观察
$http_referer字段,发现未覆盖的合法来源(如合作站点新域名)及时加入白名单
深度检测的本质,是让规则既够严(堵住盗链),又够宽(不误伤真实用户)。它依赖对 Referer 行为的细致理解,而不是堆砌关键词。











