没有自动的Request.QueryString解码的URL字符串?(does Request.Qu

2019-07-02 18:00发布

我有一个网页,我有这样一个URL工作:
/目录/公司/制造商

使用这种被重新写过一些重写规则

与/目录/公司/邓肯%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"]给我'邓肯甜甜圈$'

我不明白这里的不同的行为。 为什么它看起来就像一个符号URL编码的价值,你居然请求特定的键之前被解码,但另一个URL编码的字符,如美元符号,你居然要求特定的键后才被解码?

这是最近的变化? 我一直以为Request.QueryString[key]没有首先解码它返回的实际文本。 或者它有一些做与URL重新写?

Answer 1:

与更换与号%26应该引起转义该值,所以Request.QueryString["manf"]将产生dunkin&donuts

的提问者此类似的问题,最终意识到,在同一页上一些其他的代码结束了解码之前的他连字号。 难道你有类似的事情发生? 也许一些JavaScript被解码%26将其发送到服务器之前为符号。 尝试使用Firebug或Chrome的开发者工具,看到正在从浏览器发送实际的URL字符串。

更新

在这个问题再次看后,我意识到,你可能使用URL重写。 这篇文章描述了一个类似的问题,我不知道肯定的解决方案,但你可能想尝试双重编码与符号用%2526代替%26



Answer 2:

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

如果你想它编码的,只是做:

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

在符号具体而言,这是一个特殊情况,字符,因为它已经作为查询字符串分隔符。 URL编码和解码的符号应该总是给你&正是由于这个原因。



Answer 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}}。 它解决了这个问题对我来说!



文章来源: does Request.Querystring automatically url decode a string?