重定向时如何在 Safari 中保留 uri 片段?

Posted

技术标签:

【中文标题】重定向时如何在 Safari 中保留 uri 片段?【英文标题】:How do I preserve uri fragment in safari upon redirect? 【发布时间】:2013-08-01 16:47:17 【问题描述】:

我的 gwt / gae 应用程序利用了活动和地点。为了创建异步过程(例如重置密码或验证电子邮件地址的所有权),我使用了一种模式,其中活动的状态可以被标记化并存储在数据存储中,然后检索并在以后恢复。为了检索状态令牌,我有一个地方,它将一个增强的令牌 id 作为参数,从数据存储中获取它,然后根据需要导航到适当的地方以恢复处理。这使我能够创建指向我的应用程序特定状态的链接,该链接可以通过电子邮件分发。例如:

http://mydomain.com/#signup:anJlbmZyb0BldGhvc2VkZ2UuY29tfDEzNzQxOTIxNjU3NjQ=

在这种情况下,上述链接将发送到注册期间使用的电子邮件地址,并且应用程序将恢复由哈希参数标识的注册活动。

直到最近,当我通过将以下代码添加到我的 web.xml 中添加 SSL 证书并为所有请求强制执行 https 时,一切都运行良好:

<security-constraint>
    <web-resource-collection>
        <url-pattern>/*</url-pattern>
    </web-resource-collection>
    <user-data-constraint>
        <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
</security-constraint>

此约束通过(我相信)301 重定向到端口 443 强制执行 https。在 Chrome、Firefox 和 IE 中就像一个魅力......但是 safari 似乎在重定向时删除了 url 片段......我认为你可以看看我的问题!如何防止 safari 丢弃 url 片段?!

更新 8.1.13

经过深入研究,我想我已经找到了根本原因,但我还没有找到好的解决方案。 w3c 备忘录Handling of fragment identifiers in redirected URLs (1999) 中提供了对该问题的全面描述

基本上,http 规范并不清楚在 3xx 重定向期间处理 url 片段;并且 safari 选择在重定向时删除片段。请参阅以下 bugzilla 错误:

https://bugs.webkit.org/show_bug.cgi?id=24175

w3c 的常见用户代理问题描述了所需的行为:

http://www.w3.org/TR/cuap#uri

因此,鉴于这一切,我相信这是一个 safari (webkit) 问题。我不明白的是为什么其他 webkit 浏览器不受影响?有已知的解决方法吗?

【问题讨论】:

这个问题的解决方案有什么运气吗?我在 ios 上使用 Safari 时遇到了同样的痛苦。 【参考方案1】:

只需提供一个重定向页面 (200),它会在加载时刷新 window.location 并注入哈希片段。

<!DOCTYPE html>
<meta charset="utf-8">
<html>
<body>
<script>
    var hash = (location.href.split("#")[1] || null);
    var pathField = "redirectUri";
    if (hash) 
        if (pathField.indexOf("#") == -1) 
            pathField = pathField + "#" + hash;
        
    
    window.location = pathField;
</script>
</body>
</html>

这样,它适用于所有浏览器(至少支持 javascript 的浏览器)。 redirectUri 是您要重定向到的 URL。如果它已经包含一个片段,它不会被覆盖。

【讨论】:

您可能必须编写自己的 https 重定向逻辑来服务于该页面,而不是默认实现(可能执行 3xx)。 请注意其他人,此解决方案应仅用作短期修复。

以上是关于重定向时如何在 Safari 中保留 uri 片段?的主要内容,如果未能解决你的问题,请参考以下文章

如何获取 URL Scheme myapp:// 以使用 Instagram API 重定向 uri

如何在使用 keycloak 进行身份验证时处理 uri 重定向

.htaccess 结合 301 重定向和 URI 重写

当提供者不支持自定义 URI 方案时如何重定向到 iOS

在laravel中重定向到外部url时如何保留会话数据

Xcode,Swift:如何检测链接点击并停止重定向 Safari?