https跳转外部链接时referer丢失是浏览器安全策略所致,nginx可通过add_header referrer-policy显式声明策略来规范行为,需加always确保302生效,并配合proxy_hide_header避免后端干扰。

HTTPS 站点重定向到外部链接时 Referer 丢失,不是 Nginx 默认“清空”了它,而是浏览器出于安全策略主动截断或降级 Referer —— 但 Nginx 可以通过控制 Referer-Policy 响应头,明确告诉浏览器如何处理 Referer,从而在合规前提下最大限度保留有用信息。
为什么 HTTPS 页面跳转外部链接时 Referer 经常变空或只剩域名
现代浏览器(Chrome、Firefox、Safari)默认对跨协议、跨域跳转启用严格的 Referer 策略:
– 从 HTTPS → HTTP:直接抹掉 Referer(防止敏感路径泄露明文);
– 从 HTTPS → HTTPS 外部域名:通常只保留源站协议+主机名(如 https://a.com),丢弃路径和参数;
– 这是浏览器行为,Nginx 无法绕过,但可以主动声明策略,避免被降级为最保守的 no-referrer。
用 add_header 设置 Referer-Policy 响应头
在对应 location 或 server 块中添加:
-
推荐宽松但安全的写法:
add_header Referrer-Policy "no-referrer-when-downgrade" always;
这是浏览器默认行为,Nginx 显式声明后可确保一致;HTTPS→HTTPS 外链保留完整 Referer,HTTPS→HTTP 则自动降级为仅发送源协议+主机。 -
若需向可信 HTTPS 合作方传递完整路径:
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
同源保留全 Referer;跨源 HTTPS 保留协议+主机+路径;跨源 HTTP 仍降级为 origin。 -
绝对禁止 Referer 泄露(极少数高敏场景):
add_header Referrer-Policy "no-referrer" always;
⚠️ 注意:必须加 always,否则 302 重定向响应中该头不会生效(Nginx 默认不给 302 加自定义头)。
配合 proxy_set_header 避免后端干扰
有些后端框架(如 Spring Security、Django)会自行设置或覆盖 Referer-Policy。为确保 Nginx 的配置生效:
- 确认后端未输出同名响应头(可用
curl -I检查原始响应); - 若后端必须设头,可在 Nginx 中用
proxy_hide_header Referrer-Policy;屏蔽它,再由 Nginx 统一注入; - 不要依赖
proxy_set_header Referer $http_referer;—— 这是传给后端的请求头,不影响浏览器发出重定向时的行为。
验证是否生效
用 curl 模拟一次触发重定向的请求:
curl -I -k https://your-site.com/some-redirect-path检查响应头中是否包含你设定的 Referrer-Policy,且状态码为 302;再在浏览器开发者工具 Network 标签页中查看该跳转请求的 Request Headers,确认 Referer 字段内容符合预期策略。











