24

我正在处理一个页面,其中有一个类似的网址:
/directory/company/manufacturer

使用一些重写规则,这会被重写

使用 /directory/company/dunkin%26donuts/ 进行测试

一些制造商的名称中有一个&符号。所以我想我可以用%26. 但是,当我调试代码并将鼠标悬停在Request.QueryString它上面时,它会显示给我{qq=company&manf=dunkin&donuts&cond=}Request.QueryString["manf"]给我“dunkin”

如果我使用%24($) 而不是 & 符号,悬停在上面Request.QueryString会给我 {qs=company&manf=dunkin%24donuts&cond=}Request.QueryString["manf"]给我 'dunkin$donuts'

我不明白这里的不同行为。为什么在您实际请求特定密钥之前,似乎与符号的 url 编码值已被解码,但另一个 url 编码字符(如美元符号)仅在您实际请求该特定密钥后才被解码?

这是最近的变化吗?我一直认为Request.QueryString[key]在没有先解码的情况下返回实际文本。还是与 url 重写有关?

4

3 回答 3

43

UrlDecode()当您通过键索引(即 ( ) 访问属性时,ASP.NET 会自动调用Request.QueryString["key"]

如果要对其进行编码,只需执行以下操作:

HttpUtility.UrlEncode(Request.QueryString["key"]);

具体而言,就&符号而言,这是一个特殊的大小写字符,因为它已被用作查询字符串分隔符。&由于这个原因,URL 编码和解码 & 符号应该总是给你。

于 2012-10-26T22:52:36.263 回答
10

将 & 号替换为%26应该会导致该值被转义,因此Request.QueryString["manf"]yield 也会被转义dunkin&donuts

这个类似问题的提问者最终意识到同一页面上的其他一些代码最终预解码了他的&符号。有没有可能发生类似的事情?也许一些 javascript%26在将其发送到您的服务器之前将其解码为 & 符号。尝试使用 Firebug 或 Chrome 的开发者工具查看从浏览器发送的实际 URL 字符串。

更新

再次查看问题后,我意识到您可能正在使用 URL 重写器。这篇文章描述了一个类似的问题,我不确定是否有解决方案,但您可能想尝试使用%2526而不是%26.

于 2012-10-26T23:08:44.610 回答
3

我认为一个解决方案可能是将 UrlRewrite 规则修改为类似的东西。

    <rule name="TagPage" stopProcessing="true">
      <match url="^(tag)/([^/]+)/?$"/>
      <conditions logicalGrouping="MatchAll">
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true"/>
        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true"/>
      </conditions>
      <action type="Rewrite" url="ListByTags.aspx?tag={UrlEncode:{R:2}}"/>
    </rule>

这里重要的一行是 {UrlEncode:{R:2}}。它为我解决了问题!

于 2012-12-20T10:31:23.787 回答