必须用Referrer-Policy响应头全局配置,因HTML属性和<meta>仅对<img><iframe>等主动请求标签单次生效,无法覆盖fetch()、XMLHttpRequest、资源加载等关键路径。

直接结论:必须用 Referrer-Policy 响应头全局配置,仅靠 HTML 属性或 <meta> 标签无法覆盖 JS 发起的请求、资源加载、Service Worker 等关键路径,防不住真实泄露。
为什么只加 referrerpolicy 属性不管用
它只对 <a>、<img>、<script>、<iframe>、<form> 这类主动发起请求的标签单次生效。比如你给 <img src="https://cdn.com/photo.jpg" referrerpolicy="no-referrer"> 加了属性,图片加载时 Referer 被裁剪;但页面里埋点 SDK 用 fetch() 上报数据,这个请求完全不认该属性——它只看响应头。
常见错误现象:
- 用户点击链接跳转后,新页面里 JS 自动发的请求仍带完整
Referer(含?token=xxx) -
<meta name="referrer" content="no-referrer">对new Image().src = url或动态创建的<script>无效 - 写了
<div referrerpolicy="no-referrer">—— 浏览器直接忽略,因为<div>不发起网络请求
Nginx 配置 Referrer-Policy 的正确写法
在 server 或 location 块中加一行即可,但要注意作用域和继承关系:
-
add_header Referrer-Policy "strict-origin-when-cross-origin";—— 推荐默认值,同源发全 URL,跨 HTTPS 只发源,HTTPS→HTTP 不发 - 不要写成
add_header Referrer-Policy "strict-origin-when-cross-origin"; always;——always参数必须跟在引号后,且中间无空格:add_header Referrer-Policy "strict-origin-when-cross-origin" always; - 如果用了
add_header但子 location 没显式继承,可能被覆盖;建议统一放在 server 级,或用more_set_headers(需 ngx_headers_more 模块)避免覆盖 - 确认响应头确实发出:用 Chrome DevTools → Network → 点开任意 HTML/JS/CSS 请求 → Headers → Response Headers 查看是否含
Referrer-Policy
strict-origin-when-cross-origin 为什么比默认值安全
浏览器默认策略是 no-referrer-when-downgrade,它在 HTTPS → HTTPS 跨域时仍发送完整 URL(含路径和 query),极易泄露敏感参数。而 strict-origin-when-cross-origin 在同样场景下只发 https://example.com,路径和参数全部丢弃。
典型对比:
- 用户从
https://app.com/user?id=123&token=abc点击跳转到https://analytics.com:
默认策略 → 对方收到Referer: https://app.com/user?id=123&token=abc
设为strict-origin-when-cross-origin→ 对方只收到Referer: https://app.com - 该策略被 Chrome 64+、Firefox 69+、Safari 15.4+ 原生支持,无需 polyfill
- 注意大小写:写成
Strict-Origin-When-Cross-Origin或strict-origin-when-crossorigin(少个-)会被浏览器静默降级为默认策略
CDN 图片 403 或统计失效时怎么调
Referrer-Policy 只裁剪 Referer 头,不改变请求本身。下游服务是否放行,取决于它自己的 Referer 白名单规则。
- CDN 返回
403 Forbidden?检查它是否只允许https://yoursite.com/*(需完整路径),而你设的是origin(只发https://yoursite.com)→ 改 CDN 白名单为https://yoursite.com,或临时用referrerpolicy="origin"测试 - 埋点日志里 Referer 为空?说明用了
no-referrer,但后端统计依赖 Referer 归因 → 切回strict-origin-when-cross-origin,它在同源时仍发完整 URL - Safari ≤15.3 忽略
origin-when-cross-origin,回退到默认策略 → 不要用这个值,坚持用strict-origin-when-cross-origin,兼容性更好
真正容易被忽略的点是:Referrer-Policy 不是“开了就万事大吉”的开关,它和下游服务的校验逻辑必须匹配;而且它只管 Referer 字段本身,对 Cookie、User-Agent、fetch() 的 body 内容完全无影响。

















