HTTP重定向时如何移除URL末尾Facebook自动添加的#_=_哈希后缀?
问题根源
哈希片段(URL中#后的内容)属于浏览器端控制的资源,不会被发送到服务端。浏览器执行HTTP重定向时,如果新的Location响应头未明确指定哈希片段,会自动将原URL的哈希片段附加到新地址后,这是所有主流浏览器的标准行为,就是你遇到#_=_残留的核心原因。
纯后端解决方案
方案1:使用Refresh头实现重定向(最优解,无残留)
Refresh头触发的浏览器重定向不会继承原URL的哈希片段,完全不需要JS参与,仅需修改后端响应头即可:
- 处理完Facebook回调的鉴权、会话创建逻辑后,不要返回302状态码加
Location头,改为返回200状态码,新增Refresh头设置0秒后跳转到首页。 - 最终响应头示例:
HTTP/1.1 200 OK Server: nginx/1.19.0 Date: Sun, 28 Nov 2021 10:44:31 GMT Content-Type: text/plain; charset="UTF-8" Content-Length: 0 Refresh: 0; url=https://mike.local/ Set-Cookie: s=XXX; Path=/; Expires=Fri, 01 Jan 2038 00:00:00 GMT; SameSite=None; Secure; Set-Cookie: p=XXX; Path=/; Expires=Fri, 01 Jan 2038 00:00:00 GMT; SameSite=Strict; Secure;
该方案兼容性覆盖所有主流浏览器,最终跳转后的地址栏完全没有多余后缀。
方案2:修改Location头主动覆盖哈希(实现最简单,可接受单#残留可用)
如果坚持使用302重定向,可以在Location头的目标地址末尾主动加空哈希,覆盖原有的#_=_:
Location: https://mike.local/#
最终地址栏仅会残留单个#,不会出现#_=_,实现成本极低。
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

