【问题标题】:hashtags (#) in URL encoded parameters decoded on redirect重定向时解码的 URL 编码参数中的主题标签 (#)
【发布时间】:2013-09-23 20:09:39
【问题描述】:

我有两个服务器系统...一个托管应用程序,另一个托管身份验证/授权。当应用程序检测到用户尚未登录时,它会重定向到身份验证服务器,并将用户最初请求的 URL 作为参数传递,以便在身份验证后将用户重定向回应用程序服务器到最初请求的确切网址。

但是,如果该原始 URL 包含 #,则整个例程都会被破坏。浏览器似乎正在解码 url 编码参数,因此,将 # 之后的任何内容都丢弃到地板上。我在 Chrome、Safari 和 Firefox 上都试过了。

例子:

原网址:

https://xxx.com/#/main/by-users?param1=53&param2=13&param3=39

重定向网址:

https://yyy.com/signin/?returnURL=https%3A%2F%2Fxxx.com%3A80%2F%23%2Fmain%2Fby-users%3Fparam1%3D53%26param2%3D13%26param3%3D39

浏览器显示:

https://yyy.com/signin/?returnURL=https%3A%2F%2Fxxx.com%2F#/main/by-users?param1=53&param2=13&param3=39

如您所见,包括 # 在内的所有内容都已解码。因此,服务器永远不会获得完整的“returnURL”参数值。它基本上只是得到

https://xxx.com/

这一定是某个地方的某些规范的一部分,尽管编码的 # 应该被解码和处理,就好像它从一开始就没有编码一样,这似乎很疯狂。但是如何解决这个问题呢?

谢谢。

【问题讨论】:

    标签: http redirect hashtag


    【解决方案1】:

    不确定这是否是最好的解决方案,或者即使您可以控制它,但如果您进行双重编码,它可能会起作用:例如,使用“%23”代替“%23”。

    然后,不需要的解码应将“%2523”转换为“%23”,将所需结果留在浏览器显示的重定向 URL 中。

    【讨论】:

    • 是的,我试过了。最后,问题是我正在从服务器进行重定向,这又一次,在 # 之后再也看不到任何东西了。唯一的解决方案是使用 javascript a) 执行重定向或 b) 在编码参数中向服务器提供“当前 url”。
    【解决方案2】:

    您需要对“#”字符进行 URI 转义。

    【讨论】:

    • 呃.. 我做到了。重定向网址:yyy.com/signin/?returnURL=https%3A%2F%2Fxxx.com%3A80%2F**%23**%2Fmain%2Fby-users%3Fparam1%3D53%26param2%3D13%26param3%3D39
    • 啊,好的。刚刚在地址栏中解码。您可能想要进行 HTTP 跟踪以查看线路上发生了什么。请记住,#fragment 部分实际上并不是由浏览器发送到服务器的,因此这可能会导致问题。最好避免使用标签 URI(请参阅w3.org/blog/2011/05/hash-uris
    • 你在正确的轨道上。服务器正在执行重定向的事实是问题的根源。我需要 javascript 帮助来完成它,要么为我做重定向,要么向服务器端提供完整的 url(编码)。
    猜你喜欢
    • 1970-01-01
    • 2019-10-23
    • 1970-01-01
    • 2013-01-29
    • 1970-01-01
    • 1970-01-01
    • 2019-06-30
    • 2020-12-26
    • 1970-01-01
    相关资源
    最近更新 更多