我有一个网页,我有这样一个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重新写?
与更换与号%26
应该引起转义该值,所以Request.QueryString["manf"]
将产生dunkin&donuts
。
的提问者此类似的问题,最终意识到,在同一页上一些其他的代码结束了解码之前的他连字号。 难道你有类似的事情发生? 也许一些JavaScript被解码%26
将其发送到服务器之前为符号。 尝试使用Firebug或Chrome的开发者工具,看到正在从浏览器发送实际的URL字符串。
更新
在这个问题再次看后,我意识到,你可能使用URL重写。 这篇文章描述了一个类似的问题,我不知道肯定的解决方案,但你可能想尝试双重编码与符号用%2526
代替%26
。
ASP.NET会自动调用UrlDecode()
当您通过密钥索引访问属性(即( Request.QueryString["key"]
如果你想它编码的,只是做:
HttpUtility.UrlEncode(Request.QueryString["key"]);
在符号具体而言,这是一个特殊情况,字符,因为它已经作为查询字符串分隔符。 URL编码和解码的符号应该总是给你&
正是由于这个原因。
我认为一个解决办法可能是修改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}}。 它解决了这个问题对我来说!