为什么Response.Redirect UrlEncoding它提供的格式良好的URL的某些部分?

时间:2015-07-28 12:30:57

标签: redirect iis asp-classic urlencode

我有一个小的(经典)ASP文件用于重定向。我想将用户发送到可能包含某些字符的URL(我从传入的URL中获取此信息,因为它将所有路径从domainA重定向到domainB,但我在此处对其进行了硬编码以简化操作)。

这是一个示例网址,因为它涉及重定向脚本:

https://old.example.org/my%20test/?name=Danny%20Tuppeny

URL包含两个空格,我确定它们都是正确编码的。如果您使用文字空格将网址粘贴到浏览器中,则两者都会被浏览器转换为%20

我将此网址传递给Response.Redirect(为简单起见,此处为硬编码):

<%
Response.Redirect "https://new.example.org/my%20test/?name=Danny%20Tuppeny"
%>

然而,输出的位置标题再次 %20的编码之一,如下所示:

Location: https://new.example.org/my%2520test/?name=Danny%20Tuppeny

这是出乎意料的!这是asked before,但所有答案(包括例外的答案)似乎都是错误的。我不相信我应该随机解码部分有效的URL来抵消ASP中出现的意外/不良行为。

docs没有提到这种行为(他们甚至说“总是验证并编码传递给Response.Redirect的URL”),更糟糕的是,有关于如何应用 HTML的示例编码传递给Response.Redirect的值,这似乎更不正确。

注意: ASP.NET 有这种愚蠢的行为。

有没有办法将格式正确的网址传递给Response.Redirect并让它按预期进行操作?

2 个答案:

答案 0 :(得分:2)

要解决编码问题,可以添加Location标头以执行重定向。不会对URL应用任何编码。

Response.Status = "302 Moved Temporarily"  ''// or use whatever status code is appropriate
Response.AddHeader "Location", "https://new.example.org/my%20test/?name=Danny%20Tuppeny"

答案 1 :(得分:0)

文档很旧。
Redirect将隐式“url encode”应用于除查询字符串之外的所有URL部分。它仅在未编码时将url encode应用于查询字符串部分。如您所见,Location头中的查询字符串部分是清除的,不会再次编码。这是一种预期的无证件行为,当然不是随机的。我不是说它是对的,但它是ASP的Redirect所做的。

  

有没有办法将格式正确的URL传递给Response.Redirect并且有   它做了预期的事情吗?

没有。发送原始网址而不进行编码,重定向会根据Response.CodePage对其进行编码。

.hover

或使用解决方法。

Response.Redirect "https://new.example.org/my test/?name=Danny Tuppeny"