referrer-policy是w3c制定的控制referer头发送行为的安全策略,通过http响应头、html meta标签或资源元素属性配置,常用值包括no-referrer-when-downgrade(默认)、origin、strict-origin-when-cross-origin等,兼顾隐私保护与功能可用性。

Referrer-Policy 必须用 mod_headers 配置,且必须确保模块已启用——否则所有 Header 指令都会静默失效。
确认 mod_headers 已启用
Apache 不默认启用 mod_headers,未启用时加了 Header 指令也没任何效果,连错误日志都不报。
- Debian/Ubuntu 系统执行:
a2enmod headers,然后systemctl restart apache2 - RHEL/CentOS 系统检查
/etc/httpd/conf.modules.d/00-base.conf中是否含LoadModule headers_module modules/mod_headers.so,没有就手动添加并重启httpd - 不确定是否启用?运行
apache2ctl -M | grep headers(或httpd -M | grep headers),输出含headers_module才算成功
Referrer-Policy 值选哪个才真正兼顾安全与功能
设成 no-referrer 最“干净”,但会断掉很多分析工具(如 Google Analytics)的来源追踪;设成 unsafe-url 则等于没设。实际推荐按场景选:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 普通网站、博客、企业官网:用
no-referrer-when-downgrade—— HTTPS → HTTP 不发 Referer,HTTPS ↔ HTTPS 正常发,兼容性好,隐私有底线 - 后台管理页、敏感操作页(如 /admin/、/account/):在
<location></location>块里单独设为same-origin,避免跨域泄露路径 - 纯静态资源站(如 CDN 图床):可设
origin-when-cross-origin,既防 Referer 泄露完整 URL,又保留基础来源标识 - 绝对禁止任何引用信息(如合规强要求):才用
no-referrer,但需同步检查前端 JS 是否依赖document.referrer
配置位置和指令写法必须匹配作用域
写错位置会导致策略不生效,比如把全局策略写进 <directory></directory> 块里,CSS/JS 文件可能就拿不到头;反过来,在虚拟主机外写 Header always set 又可能被子配置覆盖。
- 全站生效(最常用):放在
<virtualhost></virtualhost>或<virtualhost></virtualhost>块内,用Header always set Referrer-Policy "no-referrer-when-downgrade" - 仅对静态资源生效(配合防盗链):放在
<locationmatch></locationmatch>块里,避免影响 API 接口 - 避免重复设置:不要在同一个作用域里既用
Headerset又用Header always set,后者优先级更高,前者可能被忽略 - 注意拼写:是
Referrer-Policy(两个 r),不是Referer-Policy(一个 r)——拼错浏览器直接无视
验证是否生效及常见失效原因
配完不验证等于白配。打开 Chrome DevTools → Network → 刷一次页面 → 点任意请求 → Headers 标签页下找 Referrer-Policy 响应头。
- 没看到头?先检查 Apache 错误日志:
tail -f /var/log/apache2/error.log,看是否有Invalid command 'Header'类报错(说明mod_headers没启) - 看到头但值不对?可能是其他配置覆盖了它,比如宝塔面板或某些 CMS 插件也会注入响应头,优先级可能更高
- HTTPS 站点却收到
no-referrer?检查是否在 HSTS(Strict-Transport-Security)启用后,浏览器强制降级导致策略被重写 - CDN(如 Cloudflare)后面部署 Apache?CDN 可能默认覆写或清空自定义头,需在 CDN 控制台显式开启“保留自定义响应头”选项
最易被忽略的一点:Referrer-Policy 是逐跳生效的,如果中间有反向代理(Nginx → Apache)、或用了 Service Worker,策略可能在某一层被截断或重写,不能只看 Apache 日志或本地 curl 结果。










