URL 在 302 登录重定向后被 IE 删除的片段

URL fragment removed by IE after 302 login redirect

我们在应用程序中使用 SiteMinder 身份验证。

如果应用用户尝试通过直接 URL 或通过书签 URL 导航到我们应用中的特定页面 https://ourapp.com/myapp/#/pending/requestsSiteMinder 将重定向到 login page 通过 302 重定向类似于 http://ourapp.com/login?redirect=https%3A%2F%2Fourapp.com%2Fmyapp%2F#/pending/requests 要求用户在 登录表单 中输入凭据。身份验证成功后,用户应被重定向到我们的应用程序并登陆请求的页面(/pending/requests)。

它在 ChromeFirefox 中运行得非常好。对于 IE,它会登陆 https://ourapp.com/myapp/#/home(默认登陆页面)而不是 https://ourapp.com/myapp/#/pending/requests.

我在我们的应用程序代码中尝试了 google search results 中提供的各种解决方案,例如,

// setting location back
window.location = window.location;
// setting location hash back
window.location.hash = window.location.hash;

尽管 this Q & A 完全有道理,

我还想preserve the URL hash fragment in IE even it's 3xx redirect满足我的要求...!?

回答我自己的问题

我发现在成功验证后,SiteMinder 正在通过使用 登录表单隐藏变量 value[=57= 对用户请求的应用程序页面执行 302 redirection ](它存储用户请求的 URL /myapp/ - without hash fragment 因为它不会被发送到服务器)名称类似于 redirect。下面的示例表格

由于redirect隐藏变量仅包含/myapp/而没有散列片段,并且它是一个302重定向,散列片段甚至在之前就被IE自动删除了来到我们的应用程序,我们在应用程序代码中尝试的任何解决方案都没有奏效。

IE 仅重定向至 /myapp/,并登陆我们应用程序的默认主页 https://ourapp.com/myapp/#/home

浪费了将近一天的时间来弄清楚这种行为。

解决方法是:

已更改 登录表单 隐藏变量 (redirect) value 以保存哈希片段 附加 window.location.hash 以及现有值。类似于下面的代码

$(function () {
  var $redirect = $('input[name="redirect"]');
  $redirect.val($redirect.val() + window.location.hash);
});

此更改后,redirect 隐藏变量将用户请求的 URL 值存储为 /myapp/#/pending/requestsSiteMinder 将其重定向到 IE 中的 /myapp/#/pending/requests .

以上解决方案在所有三种浏览器中都运行良好Chrome, Firefox and IE

感谢@AlexFord detailed explanation and providing solution 解决这个问题。