IIS6 与 IIS7 和 IIS7.5:处理基础 URL(不是查询字符串)中带有加号 (+) 的 URL

IIS6 与 IIS7 和 IIS7.5:处理基础 URL(不是查询字符串)中带有加号 (+) 的 URL

对于基本 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:

  1. 测试_某物.aspx
  2. 测试一些事情.aspx
  3. 测试一些事情.aspx

第三个文件是一个测试,用于查看 IIS7[.5] 是否将加号视为空格(就像在查询字符串中一样);但事实并非如此。有了所有这些文件,在 IIS6 中按http://somehost/test_some+thing.aspxhttp://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>

我的博客文章了解更多详细信息和参考资料。

相关内容