Express重定向时浏览器未设置Referrer请求头的原因及解决方法
302重定向后Referrer字段未设置的原因与解决方法
先看给定的Express路由代码:
router.get('/pls-redirect', function (req, res, next) { res.redirect("https://www.google.com") });
当访问mydomain/pls-redirect时,服务端返回302状态码并指向Google,但浏览器跳转后的请求头里没有带上mydomain/pls-redirect作为Referrer,原因和解决方法如下:
为什么Referrer没被设置?
这是浏览器默认的Referrer策略导致的:
- 跨域重定向场景下,浏览器默认采用
strict-origin-when-cross-origin策略,此时只会发送源地址(即mydomain)而非完整的请求路径;如果是HTTP站点跳转到HTTPS站点,部分浏览器甚至会直接省略Referrer字段,以此遵循隐私安全规范。 - 本质上是浏览器为了避免跨域场景下泄露完整的源URL路径,默认做了限制。
如何让跳转请求带上完整Referrer?
要实现这一效果,需要在重定向的响应中设置合适的Referrer-Policy头,强制浏览器发送完整的Referrer信息:
修改后的Express路由代码如下:
router.get('/pls-redirect', function (req, res, next) { // 设置Referrer策略为unsafe-url,允许跨域发送完整URL res.setHeader('Referrer-Policy', 'unsafe-url'); res.redirect("https://www.google.com"); });
注意事项:
unsafe-url策略会发送完整的URL(包含路径、查询参数等所有信息),如果你的原URL包含敏感数据,不建议使用。- 若仅需发送源地址+路径(无需查询参数),可以尝试
origin-when-cross-origin策略,但该策略在跨域场景下仍只会发送源地址,只有同域跳转才会发送完整路径。
内容的提问来源于stack exchange,提问作者Gavin
相关产品推荐
相关产品推荐

