对于基本 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 并具有不同的名称:
- test_something.aspx
- test_some+thing.aspx
- test_something.aspx
第三个文件是测试 IIS7[.5] 是否将加号视为空格(就像在查询字符串中一样);情况似乎并非如此。有了所有这些文件,在访问任何 ASP.NET 处理程序之前,在 IIS6 中点击http://somehost/test_some+thing.aspx
或http://somehost/test_some%2bthing.aspx
将正常工作,但在 IIS7/IIS7.5 中点击 404。在 IIS7/7.5 中是否有一些配置我缺少让它“看到”URL 中的加号,而不会错过用于确定 HTTP 处理程序的最终扩展名?
在搜索 IIS 和 plus 的更多组合后,似乎 IIS7[.5] 设置为默认拒绝带有加号的 URL,因为有些担心使用该字符;不过,查询字符串中仍然允许使用该符号。解决方案是更改 requestFiltering 属性默认值以允许使用
<system><webServer><security><requestFiltering>
命令行调用进行双重编码的字符(最终修改您的 ASP.NET web.config):这可能比人们更喜欢使用他们的网站更危险,但似乎没有一种方法比一揽子允许的更具体。警告是关于在 URL 中使用加号与其作为空格的典型翻译之间可能发生的不匹配。看起来唯一的另一种选择是完全停止在您的 URL 中使用加号字符。
我刚刚想出了如何制定重写规则来说服 IIS7 将加号映射到 URL 中的空格。就我而言,它是为了保持旧书签或超链接正常工作。
有关更多详细信息和参考,请参阅我的博客文章。