【问题标题】:Safari losing hash params on http redirectionSafari 在 http 重定向上丢失哈希参数
【发布时间】:2018-12-13 12:42:30
【问题描述】:

我遇到了一个问题,其中 url 片段没有得到 保留在 Safari 中的重定向上,因为它们应该根据 http 规范。


设置 -

`/url1` redirects to `/url2#hash`

`/url2` redirects to `/url3`

预期行为 -

Hitting `/url1` should redirect to `/url3#hash`

观察到的行为 -

Chrome/FF - Hitting `/url1` redirects to `/url3#hash`
Safari(11+) - Hitting `/url1` redirects to `/url3`

我确实阅读了针对早期版本的 Safari 报告的 issue。我还尝试了在其他 SO 线程中发布的solutions 徒劳。

感谢任何帮助。

【问题讨论】:

  • 同样令人愤怒的问题 - 你找到解决办法了吗?
  • Safari 至少可以重用片段部分,如果它是原始 URI 的一部分。因此,也许您可​​以考虑是否有可能以某种方式在原始请求 URL 中引入“#”部分:/url1/#foo -> /url2 应该使 Safari 仍然打开 /url2/#foo
  • 我不敢相信他们还没有解决这个问题,但我在 4 年前就遇到了这个问题
  • @LT86 还没有修复。
  • @lef 这是从一个地方重定向到另一个地方的微服务调用链。不幸/幸运的是,其中发生的任何事情对于点击第一个网址的人来说都是黑框

标签: redirect safari webkit url-redirection http-redirect


【解决方案1】:

我们今天遇到了同样的问题并做了一些额外的观察。我们还能够通过示例 Spring Boot 应用重现该问题:

@Controller
class RedirectController {

    @GetMapping("/url1")
    String url1() {
        return "redirect:/url2#hash";
    }

    @GetMapping("/url2")
    String url2() {
        return "redirect:/url3";
    }

    @GetMapping("/url3")
    @ResponseBody
    String url3() {
        return "Hello World";
    }
}

在 OSX 10.15.7 (Catalina) 上使用 Safari 14.1.2 运行时,点击 /url1/ 会导致 /url3 而不会从 /url2 转移片段 (#hash)。 但是在 OSX 11.5.2(Big Sur)上使用 Safari 14.1.2(相同版本)这样做是可行的。点击/url1 会导致/url3#hash

无论如何,点击/url1#this-is-fragment 会导致/url3#this-is-fragment

我们的假设是,Safari(在 Catalina 上)仅在片段是在浏览器中而不是在服务器上创建时才携带片段。 Big Sur 上的 Safari 似乎表现得像其他浏览器(例如 Firefox 和 Chrome)。

基于该假设,一种“解决方案”是客户端重定向,例如通过元刷新:

@Controller
class RedirectController {

    @GetMapping("/url1")
    @ResponseBody
    String url1ClientSideRedirect() {
        return """
            <html>
            <head>
              <meta http-equiv="refresh" content="0;URL='/url2#hash'">
            </head>
            <body></body>
            </html>
            """;
    }

    @GetMapping("/url2")
    String url2() {
        return "redirect:/url3";
    }

    @GetMapping("/url3")
    @ResponseBody
    String url3() {
        return "Hello World";
    }
}

我想任何使用 window.location 的客户端 JavaScript 都可以正常工作。

【讨论】:

    猜你喜欢
    • 2017-03-31
    • 2021-11-24
    • 1970-01-01
    • 2015-10-26
    • 1970-01-01
    • 2015-10-28
    • 2018-11-07
    • 2012-09-08
    • 2014-10-25
    相关资源
    最近更新 更多