繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM