【问题标题】:does Request.Querystring automatically url decode a string?Request.Querystring 会自动对字符串进行 url 解码吗?
【发布时间】:2012-10-17 05:17:09
【问题描述】:

我正在处理一个页面,其中有如下网址:
/目录/公司/制造商

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

使用 /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重写有关系?

【问题讨论】:

    标签: c# asp.net c#-4.0 url url-rewriting


    【解决方案1】:

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

    如果您想对其进行编码,请执行以下操作:

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

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

    【讨论】:

    • @StriplingWarrior 我想我回想起来只回答了他的问题的一半,我已经编辑包括为什么与符号完全不同。
    • 我意识到它是一个特殊字符 - 我只是不明白为什么它似乎在与美元符号相比在不同的点被解码。当我在调试页面时将鼠标悬停在 VS2010 中的 Request.QueryString 上时,我看到了美元符号的 urlencoded 值 - %24。但是当涉及到 & 符号时,我总是看到解码后的值。
    • 是否有参考 MSDN 文章说明 UrlDecode 被自动调用?
    • @MADCookie 伙计,我不认识,但是如果您尝试自己调试它,您肯定会看到(这就是我所做的):)
    • 调试是我一直在做的事情,是的,我看到了 Request("blah") 的值,其中 blah=Some%2fValue 给了我一些/值。在指挥队友做出改变之前,我只想从马口中听到它。这忽略了这个问题:还有什么魔法正在发生? Response 对象有什么编码魔法?
    【解决方案2】:

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

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

    更新

    再次查看问题后,我意识到您可能正在使用 URL 重写器。 This post 描述了一个类似的问题,我不确定是否有解决方案,但您可能想尝试使用 %2526 而不是 %26 对 & 符号进行双重编码。

    【讨论】:

    • 可能有其他东西正在使用该 url - 重写或站点上的其他一些预先存在的代码。这不是我创建的网站,而是我从其他人那里接管的网站。所以这里可能还涉及到其他一些代码。没想到。我会做一些挖掘工作。谢谢。一旦我有更多信息,我会更新这个问题
    • dbl 编码不起作用 btw - dunkin%2526donuts 变成了 dunkin&25donuts
    • 不确定发生了什么变化,但您对 dbl 编码的建议现在似乎正在奏效。我实际上尝试过像 %25%32%36 那样做,这也有效。但后来我认为浏览器自动将其转换为 %2526 并开始工作
    • @merk:你可能第一次做了 %2625。
    【解决方案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}}。它为我解决了问题!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-29
      • 1970-01-01
      相关资源
      最近更新 更多