我有一个小的(经典)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
并让它按预期进行操作?
答案 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"