对于基本 URL(而非查询字符串)中带有加号 (+) 的任何 URL,IIS7 和 IIS7.5(Windows Server 2008 和 2008 R2)似乎不会将 URL 转发到 ASP.NET 应用程序上的默认处理程序。我开始注意到启用自定义 HTTP 处理程序时出现的问题,*.html
但我也遇到了同样的问题*.aspx
。IIS6(Server 2003)对这些相同的 URL 没有问题。
为了复制该问题,在 ASP.NET 站点中,我创建了一组 ASPX 文件,这些文件使用各种名称执行了简单的 Response.Write:
- 测试_某物.aspx
- 测试一些事情.aspx
- 测试一些事情.aspx
第三个文件是一个测试,用于查看 IIS7[.5] 是否将加号视为空格(就像在查询字符串中一样);但事实并非如此。有了所有这些文件,在 IIS6 中按http://somehost/test_some+thing.aspx
或http://somehost/test_some%2bthing.aspx
可以正常工作,但在 IIS7/IIS7.5 中,在到达任何 ASP.NET 处理程序之前会显示 404。我是否缺少 IIS7/7.5 中的某些配置,以便让它“看到”URL 中的加号,而不会错过用于确定 HTTP 处理程序的最终扩展名?
答案1
在搜索了更多 IIS 和加号的组合后,似乎 IIS7[.5] 被设置为默认拒绝带有加号的 URL,因为有人担心会使用该字符;不过,该符号在查询字符串中仍然被允许。解决方案<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 中使用加号和其通常翻译为空格之间可能出现的不匹配。看起来唯一的其他选择是完全停止在 URL 中使用加号。
答案2
我刚刚想出了如何制定重写规则来说服 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>
看我的博客文章了解更多详细信息和参考资料。