我有允许通过/搜索/ <搜索关键词>寻找的东西路由的ASP.NET MVC应用程序。
当我提供“搜索/ ABC”它工作得很好,但是当我供应“/搜索/ A + B + C”(正确URL编码),然后IIS7拒绝与HTTP错误404.11( 请求滤波模块被配置为拒绝一请求包含双转义序列请求 )。 首先,它为什么要这样做呢? 它似乎只抛出错误,如果它是URL的一部分,但不是作为查询字符串的一部分(/发送Q = A + B + C正常工作)。
现在,我可以使我在web.config中的安全部分双逃生的要求,但我不愿这样做,因为我不理解的含义,也不为什么,服务器会拒绝请求“A + B + C”作为该URL的一部分,但接受作为查询字符串的一部分。
有人可以解释,并提供一些意见做什么?
编辑:增加了强调相关章节。
基本上:IIS进行了过度偏执。 如果你没有做什么特别不明智与URI解码的数据(如生成本地文件系统的URI通过字符串连接)您可以放心禁用此检查。
要禁用检查做如下设置( 在这里 ):(见下面我的评论什么双重转义需要)。
<system.webServer>
<security>
<requestFiltering allowDoubleEscaping="true"/>
</security>
</system.webServer>
如果加号是在搜索输入一个有效的字符,你将需要启用“allowDoubleEscaping”允许IIS来处理来自URI的路径这样的输入。
最后,很简单的,如果限制的解决方法是简单地避免“+”和使用“%20”代替。 在任何情况下,使用的“+”符号来编码空间是无效的URL编码 ,但具体到一组有限的协议,可能为了向后兼容的原因广泛支持。 如果只是为了标准化的目的,你最好编码空间为“%20”无论如何; 这很好地回避了IIS7问题(其仍然可以裁剪为其他序列,例如%25AB)。
你有没有想过有像“/搜索/ A / B / C”的搜索网址是什么?
你需要建立像路线
search/{*path}
然后从你的行动路径字符串中提取搜索值。
HTHS
查尔斯
我只想补充一些信息埃蒙Nerbonne的回答您问题相关的(没有解释个为什么)的“ 做什么 ”的一部分。
您可以轻松更改特定应用程序的设置也与
- 打开具有管理员权限的控制台(开始- CMD -右键,以管理员身份运行)
打字以下(从这里取: http://blogs.iis.net/thomad/archive/2007/12/17/iis7-rejecting-urls-containing.aspx ):
%windir%\system32\inetsrv\appcmd set config "YOURSITENAME" -section:system.webServer/security/requestfiltering -allowDoubleEscaping:true
(你可以代替例如YOURSITENAME
与Default Web Site
应用此规则的默认网站)
- 回车,准备好了。
一个例子:
- 首先,我有同样的问题:
- 键入上述文字:
- 现在,它按预期工作:
我就遇到了这个IIS 7.5下的应用程序做Server.TransferRequest()。
编码文件名引起双逃避问题,但如果我没有对其进行编码,然后我会碰上“有潜在危险的Request的”错误。
把一个任何协议,甚至一个空,在I传给Server.TranferRequest的URL()固定的问题。
不工作:
context.Server.TransferRequest("/application_name/folder/bar%20bar.jpg");
作品:
context.Server.TransferRequest("://folder/bar%20bar.jpg");