[英]Why is Response.Redirect UrlEncoding some parts of the well-formed URL it is supplied?
我有一个小的(经典)ASP文件用于重定向。 我想将用户发送到可能包含某些字符的URL(我从传入的URL中获取此信息,因为它将所有路径从domainA重定向到domainB,但我在此处对其进行了硬编码以简化操作)。
这是一个示例URL,因为它涉及重定向脚本:
https://old.example.org/my%20test/?name=Danny%20Tuppeny
URL包含两个空格,我确定它们都是正确编码的。 如果您使用文字空格将URL粘贴到浏览器中,则两者都将被浏览器转换为%20
。
我将此URL传递给Response.Redirect
(为简单起见,此处为硬编码):
<%
Response.Redirect "https://new.example.org/my%20test/?name=Danny%20Tuppeny"
%>
但是输出的位置标题再次编码%20的一个 ,看起来像这样:
Location: https://new.example.org/my%2520test/?name=Danny%20Tuppeny
这是出乎意料的! 之前已经询问过,但所有答案(包括例外的答案)似乎都是错误的。 我不相信我应该随机解码部分有效的URL来抵消ASP中出现的意外/不良行为。
文档没有提到这种行为(他们甚至说“总是验证和编码传递给Response.Redirect的URL”),更糟糕的是,有关于如何将HTML编码应用于传递给Response.Redirect
值的示例。似乎更不正确。
注:ASP.NET 没有这种愚蠢的行为。
有没有办法将格式正确的URL传递给Response.Redirect
并让它按预期执行?
要解决编码问题,可以添加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"
文件很老了。
重定向将隐式“url encode”应用于除查询字符串之外的所有URL部分。 它仅在未编码时将url encode应用于查询字符串部分。 如您所见,Location头中的查询字符串部分是清除的,不会再次编码。 这是一种预期的无证行为,当然不是随机的。 我不是说它是对的,但它是ASP的Redirect所做的。
有没有办法将格式正确的URL传递给Response.Redirect并让它按预期执行?
不发送没有编码的原始网址,重定向将根据Response.CodePage对其进行编码。
Response.Redirect "https://new.example.org/my test/?name=Danny Tuppeny"
或使用解决方法。
Sub Redirect(encodedUrl)
Response.Clear
Response.Status = "302 Object moved"
Response.AddHeader "Location", encodedUrl
Response.End
End Sub
'I'm sure my url is well-formed and I want to send it as raw
Redirect "https://new.example.org/my%20test/?name=Danny%20Tuppeny"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.