我正在使用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路由处理。
时,这非常有效问题在于我将此应用程序部署到https://example.com/
在这种情况下,如果用户点击上面的链接(通过电子邮件收到),IE 9只识别(https://example.com/Request/&#34;),服务器永远不会得到(#/ Search / Request / 123)。< / p>
我们在Web服务器上实现了企业SSO。 SSO客户端拦截http请求,并在身份验证后使用URL重定向回请求的页面。
如果#fragment未作为http请求网址的一部分发送,则sso无法重定向回同一页面。
我认为这是一个常见的场景/问题。我会不断改变URL方案作为最后的手段。例如(# 至 !)。
如何解决这个问题?
答案 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是更好的设计选择。