Response.Redirect使用〜路径

时间:2020-03-05 18:44:07  来源:igfitidea点击:

我有一种方法,可以将用户重定向到位于Web应用程序根目录的登录页面。

我正在使用以下代码:

Response.Redirect("~/Login.aspx?ReturnPath=" + Request.Url.ToString());

但是,这不起作用。我的假设是ASP.NET会自动将URL解析为正确的路径。通常我会用

Response.Redirect("../Login.aspx?ReturnPath=" + Request.Url.ToString());

但是此代码位于母版页上,可以从任何文件夹级别执行。我如何解决这个问题?

解决方案

回答

那使用呢

Response.Redirect(String.Format("http://{0}/Login.aspx?ReturnPath={1}", Request.ServerVariables["SERVER_NAME"], Request.Url.ToString()));

回答

I think you need to drop the "~/" and replace it with just "/", I believe / is the root

停在那儿! :-),除非我们想对Web应用程序进行硬编码,以便只能将其安装在网站的根目录中。

"〜/"是正确的用法,但是原始代码未按预期运行的原因是,ResolveUrl(由Redirect内部使用)会尝试首先确定所传递的路径是否正确它是一个绝对URL(例如," ** http://server/**foo/bar.htm"而不是" foo / bar.htm"),但不幸的是,它只是通过查找冒号':'来实现的。在我们提供的网址中。但是在这种情况下,它将在我们在" ReturnPath"查询字符串值中提供的URL中找到一个冒号,该冒号会将其弄糊涂,因此〜/不会得到解析。

解决方法是,我们应该使用URL编码" ReturnPath"值,该值可以避免出现问题的":"以及其他任何特殊字符。

Response.Redirect("~/Login.aspx?ReturnPath=" + Server.UrlEncode(Request.Url.ToString()));

另外,我建议我们(或者任何人)都不要使用" Uri.ToString",因为它提供了易于理解的,更"友好"的URL版本,不一定是正确的版本(它避免了转义)。而是像这样使用Uri.AbsoluteUri:

Response.Redirect("~/Login.aspx?ReturnPath=" + Server.UrlEncode(Request.Url.AbsoluteUri));