我有一个使用Forms身份验证的ASP.Net MVC网站,loginUrl设置为Url,用于在web.config中进行身份验证。登录过程调用登录控制器,该登录控制器通过SSO过程进行重定向等,日志过程正常,用户可以登录等。作为登录过程的一部分,我使用returnUrl将用户发送到他们最初的页面请求。如果没有指定,则为默认值。
如果用户在其他网页(例如http://mysite/help)中输入了网址,则returnUrl与预期/帮助相同。但是,如果用户输入包含像http://mysite/#/test/123这样的哈希路由的URL,则returnUrl只是/。是否可以从控制器中获取#/ test / 123的完整URL?
为了解决这个问题,我创建了一个简单的ASP.Net MVC Web项目来演示这种行为,正如您可以看到调用控制器时缺少#route:
这是web.config:
以下是浏览器中的请求:
以下是测试应用程序的调试视图,您可以看到ReturnUrl只是/而RawUrl只有查询字符串。
fiddler中也是如此:
以下是Chrome中登录网址的重定向。正如您所看到的,URL的#部分以某种方式保留在示例应用程序中,即使它在控制器中的请求中不存在,我也不会在fiddler中看到它。
答案 0 :(得分:1)
"#"被称为片段,被认为是"客户端依赖"。换句话说,它是客户端的,不会被发送回服务器。因此,服务器不知道片段可能会重定向到什么。见
http://en.wikipedia.org/wiki/Fragment_identifier
来自维基百科的文章:
片段取决于文档MIME类型,并由客户端(Web浏览器)进行评估。客户端在检索文档时不应该向服务器发送URI片段,如果没有本地应用程序的帮助(见下文),片段不会参与HTTP重定向。[