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

pat*_*dge 41 iis-7 iis-7.5

对于基本 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. test_something.aspx
  2. test_some+thing.aspx
  3. test_something.aspx

第三个文件是一个测试,看看 IIS7[.5] 是否将加号视为空格(就像在查询字符串中那样);情况似乎并非如此。有了所有这些文件,在进入任何 ASP.NET 处理程序之前,在 IIS6 中命中http://somehost/test_some+thing.aspxhttp://somehost/test_some%2bthing.aspx将正常工作,但在 IIS7/IIS7.5 中命中404。在 IIS7/7.5 中是否有一些配置我缺少它来“看到”URL 中的加号而不会丢失用于确定 HTTP 处理程序的最终扩展名?

pat*_*dge 42

在搜索了更多IIS和plus的组合后,似乎IIS7[.5]被设置为默认拒绝带有加号的URL,因为害怕使用那个字符;但是,查询字符串中仍然允许使用该符号。该溶液是改变的requestFiltering属性默认上<system><webServer><security><requestFiltering>以允许与一个命令行调用双编码的字符(最终修改您的ASP.NET的web.config):

%windir%\system32\inetsrv\appcmd set config "Default Web Site" -section:system.webServer/security/requestFiltering -allowDoubleEscaping:true
Run Code Online (Sandbox Code Playgroud)

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

  • 仅供参考:您不必在根级别模板上执行此操作。这可以在任何 Web.config 文件中完成,也可以应用于带有 &lt;location /&gt; 标记的子文件夹。 (2认同)

Nat*_*han 10

我刚刚想出了如何制定重写规则以说服 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>
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息和参考,请参阅我的博客文章