发送重定向时强制浏览器从 URL 中删除#hash

Posted

技术标签:

【中文标题】发送重定向时强制浏览器从 URL 中删除#hash【英文标题】:Force browser to drop #hash from the URL when sending redirect 【发布时间】:2015-01-04 14:55:16 【问题描述】:

我遇到了与 URL 的持久部分有关的问题,我们称它为 #x,用于导航。我在服务器端有一个 AuthenticationFilter,它将用户重定向到登录页面。问题是我不能让这个#x 消失。在服务器端,当我单步执行执行重定向的 Java 代码时,我看到 URL 为/login?redirectUrl=%2Fprevious%2Flocation。然而,在客户端这实际上是/login?redirectUrl=%2Fprevious%2Flocation#x。我知道这些数据实际上从未发送到服务器。我的问题是如何强制服务器告诉客户端放弃它?我必须切换到客户端重定向吗?

【问题讨论】:

【参考方案1】:

这里有几个问题可以回答这个问题 - URL hash is persisting between redirects。我最终做了一个客户端重定向以避免这个问题。

【讨论】:

如果您在302 redirect 中发送不同的#bookmark,则浏览器可能会使用它。请参阅链接问题中的第二个答案。【参考方案2】:

哈希永远不会发送到服务器。所以如果你请求一个像 example.org/my-account-overview#profile 服务器仅作为请求的资源获取 url example.org/my-account-overview

如果您改为发送重定向,浏览器应该请求新的 url,并在哈希本身之后自动添加哈希和值。

【讨论】:

【参考方案3】:

很可能是您浏览器端的一些 javascript 实际上添加了 #x,您需要在浏览器端修复它。

要验证这一点,请使用浏览器检查工具 + 网络选项卡查看浏览器和服务器发送的实际请求 + 响应标头。

如果服务器发送类似302 Redirect 的内容,它的响应Location 标头将包含它希望浏览器使用的URI。如果该 URI 不包含 #x,那么您知道浏览器本身正在添加 #x

虽然服务器可以在其Location 响应标头中发送#x,但浏览器永远不会将其发送回服务器。

【讨论】:

以上是关于发送重定向时强制浏览器从 URL 中删除#hash的主要内容,如果未能解决你的问题,请参考以下文章

强制浏览器忘记缓存的重定向?

在未登录浏览器连接 Instagram 时,OAuth Instagram API 删除重定向 URL 中的参数

重定向到`Java`中的get方法时如何从url中删除参数[重复]

浏览器302重定向传递hash

在页面刷新之前从 URL 中删除查询字符串

重定向到新网址,但从历史记录中删除以前的网址