IE9从URL中删除#parts(适用于Firefox!)

时间:2015-04-21 13:33:26

标签: asp.net-mvc angularjs internet-explorer-9 asp.net-mvc-routing

我正在使用ASP.NET MVC Routing + AngularJS路由开发应用程序。

我的网址看起来像:

https://example.com/Request/#/Search/Request/123

当我分解时(http://example.com/Request)由ASP.NET MVC路由处理。即(Area = Request,controller =" Default",action =" Index")

(#/ Search / Request / 123)由AngularJS路由处理。

当我在http://localhost:8080/

时,这非常有效

问题在于我将此应用程序部署到https://example.com/

在这种情况下,如果用户点击上面的链接(通过电子邮件收到),IE 9只识别(https://example.com/Request/&#34;),服务器永远不会得到(#/ Search / Request / 123)。< / p>

我们在Web服务器上实现了企业SSO。 SSO客户端拦截http请求,并在身份验证后使用URL重定向回请求的页面。

如果#fragment未作为http请求网址的一部分发送,则sso无法重定向回同一页面。

我认为这是一个常见的场景/问题。我会不断改变URL方案作为最后的手段。例如(# 至 !)。

如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

刚刚找到了一个完全处理这个问题的博客:

http://codetunnel.io/how-to-persist-url-hash-fragments-across-a-login-redirect/

他提出了两个想法:

  

当页面加载时,只需要一些访问哈希片段的JavaScript并将其附加到隐藏字段中的重定向URL。这是一个使用JQuery简单的例子

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

或者

  

不是将哈希片段附加到隐藏字段值,而是可以避免将其发送到服务器,只需将其附加到表单操作URL即可。

$(function () {
  var $loginForm = $('#loginForm');
  var actionUrl = $loginForm.attr('action');
  $loginForm.attr('action', actionUrl + window.location.hash);
});

答案 1 :(得分:0)

我会从你的应用程序中删除丑陋的URL。

本文将引导您删除asp.net-mvc项目中的丑陋URL。它还将确保您正确设置RouteConfig.cs。

http://www.codeproject.com/Articles/806500/Getting-started-with-AngularJS-and-ASP-NET-MVC-P

答案 2 :(得分:0)

片段(#后面的URL部分)不一定由浏览器发送到服务器端。它们仅供客户端使用(导航到文档中的特定位置,JavaScript支持)。

RFC 2396第4.1节:

  

使用URI引用对其执行检索操作时      标识资源,可选的片段标识符,分隔      由交叉阴影线(“#”)字符组成的URI由附加组成      参考信息由用户代理解释后      检索行动已成功完成。因此,事实并非如此      URI的一部分,但通常与URI结合使用。

(强调补充)

因此,除非您将#更改为其他字符,否则您提供的URL方案将无法可靠地运行。或者,您可以use JavaScript to transfer the information from the fragment in an input that will be reliably passed back to the server。但请注意,解决方案仅在浏览器中启用JavaScript时才有效,因此它(也)不是100%可靠的解决方案,可以与所有客户端一起使用。

无论哪种方式,使用不带片段的URL是一种更可靠的方法,如果您期望服务器解释该部分,IMO是更好的设计选择。