单纯靠referer检查防盗链不可靠,需启用mod_headers并配置header always set referrer-policy "strict-origin-when-cross-origin",配合空referer放行、域名精确匹配及签名url等多重措施形成务实防护。

单纯靠 Referer 检查做防盗链并不可靠,但搭配 mod_headers 设置合适的 Referrer-Policy 头,能从源头减少 Referer 泄露、降低被伪造风险,并配合其他规则形成更务实的防护层。
先确认 mod_headers 已启用
这是前提,否则所有 Header 指令都不生效,且 Apache 不报错,容易被忽略:
- Debian/Ubuntu 系统执行:
sudo a2enmod headers && sudo systemctl restart apache2 - CentOS/RHEL 系统检查
/etc/httpd/conf/httpd.conf中是否取消注释:LoadModule headers_module modules/mod_headers.so - 验证是否加载成功:
apachectl -M | grep headers,有输出即表示已启用
选择适合的 Referrer-Policy 值
不同策略影响浏览器发送 Referer 的行为,直接影响防盗链规则的“输入质量”:
-
no-referrer-when-downgrade(默认值):HTTPS 页面引用 HTTP 资源时会清空 Referer,可能导致站内图片在 HTTPS 页面中被误判为盗链 -
strict-origin-when-cross-origin:跨域时只发源(如https://example.com),不发完整路径;同域保留完整 Referer——推荐用于多数站点,平衡隐私与可用性 -
same-origin:仅同源请求携带 Referer,彻底杜绝跨域 Referer 泄露,但会使 CDN 回源、微信 WebView 内嵌页等场景失效,慎用
不建议用 no-referrer,它会让所有外部请求都无 Referer,反而导致你自己的合法外链(如公众号图文、邮件链接)也被防盗链规则拦截。
在配置中正确设置 Header 指令
必须用 Header always set,确保该头出现在所有响应中(包括 403、404),避免策略遗漏:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
<ifmodule mod_headers.c>
Header always set Referrer-Policy "strict-origin-when-cross-origin"
</ifmodule>
这段可放在:
- 虚拟主机配置块(
<virtualhost></virtualhost>)内,作用于整个站点 - 目录块(
<directory></directory>)中,作用于指定路径 -
.htaccess文件里(需允许FileInfo覆盖权限)
注意:不要写成 Header set,它只对 2xx 成功响应生效,错误页面就漏掉了。
Referrer-Policy 需和 Referer 规则协同使用
它本身不阻止盗链,但让 Referer 更可信、更可控,从而提升后续规则效果:
- 配合
mod_rewrite的 Referer 判断时,统一使用strict-origin-when-cross-origin可减少因 Referer 被截断导致的误杀(如 HTTPS 引用 HTTP 图片) - 空 Referer 必须显式放行,例如在 Rewrite 规则中加一行:
RewriteCond %{HTTP_REFERER} ^$ [OR],否则用户直接访问图片链接也会 403 - 域名要精确匹配,
example.com≠www.example.com,正则建议写成:^https?://(www\.)?example\.com($|/),并加[NC]
真正安全的防盗链不是靠 Referer 守住大门,而是结合签名 URL、登录态校验、CDN 鉴权等手段。Referrer-Policy 是其中一环,管好“谁说了算”,而不是“谁来敲门”。










