Safari在http重定向上丢失哈希参数

Urv*_*pta 16 safari redirect webkit http-redirect url-redirection

我正面临一个问题,其中url片段在Safari中的重定向时没有被保留,因为它们应该根据http规范.


设定 -

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

`/url2` redirects to `/url3`
Run Code Online (Sandbox Code Playgroud)

预期的行为 -

Hitting `/url1` should redirect to `/url3#hash`
Run Code Online (Sandbox Code Playgroud)

观察到的行为 -

Chrome/FF - Hitting `/url1` redirects to `/url3#hash`
Safari(11+) - Hitting `/url1` redirects to `/url3`
Run Code Online (Sandbox Code Playgroud)

我确实阅读过早期版本Safari报告的问题.我也尝试过在其他SO线程中发布的解决方案是徒劳的.

任何帮助表示赞赏.

Seb*_*ger 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";
    }
}

Run Code Online (Sandbox Code Playgroud)

当在 OSX 10.15.7 (Catalina) 上使用 Safari 14.1.2 运行时,点击/url1/会导致/url3不继承/url2. 但在 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";
    }
}
Run Code Online (Sandbox Code Playgroud)

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