IIS6与IIS7和IIS7.5:处理基地加号(+)的URL(不是查询string)

对于在基URL(而不是查询string)中带有加号(+)的任何URL,IIS7和IIS7.5(Windows Server 2008和2008 R2)似乎都不会将URL转发到ASP.NET应用程序上的默认处理程序。 我开始注意到*.html上的一个自定义HTTP处理程序的问题,但我与*.aspx有同样的问题。 IIS6(Server 2003)对这些相同的URL没有问题。

为了复制这个问题,我在一个ASP.NET站点中创build了一组ASPX文件,它们使用各种名称做了一个简单的Response.Write:

  1. test_something.aspx
  2. test_some + thing.aspx
  3. test_some thing.aspx

第三个文件是一个testing,看看IIS7 [.5]是否加上符号作为空格(就像在查询string中)。 这似乎并非如此。 使用所有这些文件后,打到http://somehost/test_some+thing.aspxhttp://somehost/test_some%2bthing.aspx在IIS6中可以正常工作,但在IIS7 / IIS7.5中可以正常工作.NET处理程序。 有没有IIS7 / 7.5中的一些configuration,我很想让它在URL中“看”一个加号而不遗漏用于确定HTTP处理程序的最终扩展?

在searchIIS和plus的更多组合后,似乎IIS7 [.5]被设置为拒绝带有加号的URL,因为有些人担心使用该字符。 尽pipe如此,查询string中仍然允许使用该符号。 解决的方法是改变<system><webServer><security><requestFiltering>上的requestFiltering属性,以允许使用命令行调用双重编码的字符(最终修改您的ASP.NET web.config):

 %windir%\system32\inetsrv\appcmd set config "Default Web Site" -section:system.webServer/security/requestFiltering -allowDoubleEscaping:true 

这可能比一个更喜欢在他们的网站上更危险,但似乎没有比一揽子允许更具体的方式。 警告是关于使用URL中的加号与其典型翻译作为空间之间可能发生的不匹配。 它看起来像唯一的另一种select是停止在您的url中使用加号字符。

我只是想出了如何使一个重写规则说服IIS7映射到URL中的空格。 在我的情况下,它是保持传统的书签或超链接工作。

 <?xml version="1.0" encoding="UTF-8"?> <configuration> <system.webServer> <security> <requestFiltering allowDoubleEscaping="True" /> </security> <rewrite> <rules> <rule name="RewriteUserFriendlyURL1" stopProcessing="false"> <match url="\+" /> <conditions> <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" /> </conditions> <action type="Rewrite" url="{UrlDecode:{REQUEST_URI}}" /> </rule> </rules> </rewrite> </system.webServer> </configuration> 

看到我的博客文章进一步的细节和参考。