Referrer-Policy 本身不实现防盗链,但通过规范本站发出请求的 Referer 行为,减少误判和绕过,提升 mod_rewrite 防盗链规则的稳定性与准确性。
在虚拟主机层级用 mod_headers 配置 referrer-policy 本身不能直接实现防盗链,但它能配合 mod_rewrite 提升整体防护效果——核心在于限制 referer 头的泄露范围,降低被绕过风险,同时让合法请求更可控。
为什么 Referrer-Policy 对防盗链有实际价值
防盗链依赖服务器检查 Referer 请求头是否来自白名单域名。但若用户浏览器发送了不完整、降级或伪造的 Referer(比如 HTTPS 页面引用 HTTP 资源时自动清空 Referer),可能导致本应放行的合法请求被误拒,或让攻击者更容易构造“无 Referer”请求绕过规则。
Referrer-Policy 控制的是**你自己的页面发出的请求**中是否携带 Referer,不是控制别人访问你资源时的 Referer。所以它不替代防盗链逻辑,而是让防盗链规则更稳定、更少误伤。
在虚拟主机配置中正确启用和设置
确保 mod_headers 已启用:
- 运行
sudo a2enmod headers - 执行
sudo systemctl restart apache2
编辑你的虚拟主机配置文件(如 /etc/apache2/sites-available/example.com.conf),在 <virtualhost></virtualhost> 块内添加:
<Directory "/var/www/example.com">
Header set Referrer-Policy "no-referrer-when-downgrade"
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^https?://(www\.)?example\.com [NC]
RewriteRule \.(jpg|jpeg|png|gif|webp|svg|css|js)$ - [F,L]
</Directory>注意要点:
-
Referrer-Policy "no-referrer-when-downgrade"是较平衡的选择:HTTPS 页面跳转到 HTTPS 资源时保留 Referer,跳转到 HTTP 时不发——既保障统计准确性,又避免敏感信息外泄 -
RewriteCond %{HTTP_REFERER} !^$排除空 Referer 请求,避免把直接访问(如收藏夹打开、微信内嵌页)误判为盗链 - 正则中的
https?://同时匹配 HTTP 和 HTTPS 来源,防止因协议不一致导致漏放行 - 文件后缀列表建议按实际静态资源扩展名补充,比如加上
webp、svg等现代格式
常见误配与规避建议
以下做法容易削弱效果或引发问题:
- 设成
no-referrer:你站内所有外链(包括跳转到合作方)都不带 Referer,影响对方统计,且对防盗链无额外增益 - 只在
<location></location>或.htaccess中设置:策略可能被子目录覆盖,推荐统一在<directory></directory>或<virtualhost></virtualhost>级别声明 - 忽略大小写但未加
[NC]:域名比对区分大小写,会导致EXAMPLE.COM被拒绝 - 未重启 Apache 或未重载配置:修改后必须
systemctl reload apache2或restart才生效
搭配其他手段增强实效性
单靠 Referrer-Policy + Referer 检查仍可被 iframe、fetch、meta 标签等绕过。建议组合使用:
- 对关键资源(如图片)返回
X-Frame-Options: DENY或Content-Security-Policy: frame-ancestors 'none',防 iframe 盗链 - 用
Header always set Content-Security-Policy "referrer no-referrer"强制全站策略(比 HTML meta 更可靠) - 对高价值资源考虑服务端校验(如 Token 签名 URL)或改用 CDN 的 Referer 黑白名单功能,弥补 HTTP 头易伪造的缺陷

















