协议重定向错误地将 React JS 应用程序路由到 IE9 中的默认页面
Protocol redirect incorrectly routing React JS app to default page in IE9
我一直在使用 rackt/react-router 开发 React JS 应用程序,最近测试发现了 IE9 特有的奇怪行为。
上下文:
我们将 F5 设置为执行协议重定向 (302),这样如果有人试图导航到 http://react.site.root/#/virtual.page it will redirect them to https://react.site.root/#/virtual.page. Since this is a single page app the redirect is really occurring on http://react.site.root/。此重定向是 Keep-Alive 请求的结果。
问题:
在 IE9 中,当此协议重定向发生时,用户最终会到达 https://react.site.root/#/default.route,而不管他们试图访问的是哪个虚拟页面。此问题在更高版本的 IE、Chrome(桌面或 Android)、iPhone 5s 或 6(没有实际设备来测试其他)中未见。有趣的是,在 BrowserStack 中使用任何 iPhone 版本时也会发生这种情况。
我的研究:
我还使用 Whosebug 和 Google 进行了搜索,我发现的唯一半相关问题是 IE9 缓存重定向,但据我所知,这仅适用于 301 重定向,因为协议重定向路径不包括虚拟页面或 cookie 中似乎不合适的任何路由数据。尽管如此,我还是找到了一个测试,需要删除浏览器历史记录和 运行 InPrivate Browsing 下的一个选项卡,这表明这不是问题所在。我还在 Fiddler 中记录了工作浏览器和 IE9 的请求和重定向响应,没有发现任何可疑之处。
似乎 IE9 正在将重定向页面视为新页面,因为原始 javascript 上下文可能在重定向时被破坏,这可以解释为什么 React 使用默认路由。不幸的是,我不知道如何检验该理论或总体上解决这个问题。非常感谢任何帮助。
我找到了答案。简而言之,IE9 和一些较旧的浏览器忘记了最初请求的 URL 的片段部分,只会使用重定向响应中存在的片段。由于浏览器在向服务器发出原始请求之前删除了片段,因此它不能出现在重定向位置。
有关详细信息,请参阅以下内容:
URL Fragment and 302 redirects
http://blogs.msdn.com/b/ieinternals/archive/2011/05/17/url-fragments-and-redirects-anchor-hash-missing.aspx
把这个放在你的 <head>
的顶部:
<script>
window.location.hash = window.location.hash
</script>
问题已解决
我一直在使用 rackt/react-router 开发 React JS 应用程序,最近测试发现了 IE9 特有的奇怪行为。
上下文:
我们将 F5 设置为执行协议重定向 (302),这样如果有人试图导航到 http://react.site.root/#/virtual.page it will redirect them to https://react.site.root/#/virtual.page. Since this is a single page app the redirect is really occurring on http://react.site.root/。此重定向是 Keep-Alive 请求的结果。
问题:
在 IE9 中,当此协议重定向发生时,用户最终会到达 https://react.site.root/#/default.route,而不管他们试图访问的是哪个虚拟页面。此问题在更高版本的 IE、Chrome(桌面或 Android)、iPhone 5s 或 6(没有实际设备来测试其他)中未见。有趣的是,在 BrowserStack 中使用任何 iPhone 版本时也会发生这种情况。
我的研究:
我还使用 Whosebug 和 Google 进行了搜索,我发现的唯一半相关问题是 IE9 缓存重定向,但据我所知,这仅适用于 301 重定向,因为协议重定向路径不包括虚拟页面或 cookie 中似乎不合适的任何路由数据。尽管如此,我还是找到了一个测试,需要删除浏览器历史记录和 运行 InPrivate Browsing 下的一个选项卡,这表明这不是问题所在。我还在 Fiddler 中记录了工作浏览器和 IE9 的请求和重定向响应,没有发现任何可疑之处。
似乎 IE9 正在将重定向页面视为新页面,因为原始 javascript 上下文可能在重定向时被破坏,这可以解释为什么 React 使用默认路由。不幸的是,我不知道如何检验该理论或总体上解决这个问题。非常感谢任何帮助。
我找到了答案。简而言之,IE9 和一些较旧的浏览器忘记了最初请求的 URL 的片段部分,只会使用重定向响应中存在的片段。由于浏览器在向服务器发出原始请求之前删除了片段,因此它不能出现在重定向位置。
有关详细信息,请参阅以下内容:
URL Fragment and 302 redirects
http://blogs.msdn.com/b/ieinternals/archive/2011/05/17/url-fragments-and-redirects-anchor-hash-missing.aspx
把这个放在你的 <head>
的顶部:
<script>
window.location.hash = window.location.hash
</script>
问题已解决