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


38

对于在基本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_some 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处理程序的最终扩展名?


我想知道转义加号是否会有所帮助。也许\+吧?
暂停,直到另行通知。

Answers:


39

在搜索IIS和加号的更多组合后,由于担心使用该字符,因此默认情况下,似乎已将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

这可能比人们喜欢使用其网站要危险的多,但似乎没有一种方法比明确允许的更具体。警告是有关在URL中使用加号和将其典型翻译为空格之间可能发生的不匹配。似乎唯一的其他选择是完全停止在URL中使用加号。


2
仅供参考:您不必在根级别模板上执行此操作。可以在任何Web.config文件中完成此操作,也可以将其应用于带有<location />标记的子文件夹。
mdonatas

在IIS管理器中:站点=> YourSite =>请求筛选=>编辑功能设置... =>选中允许两次转义=> OK
diynevala

9

我只是想出了如何制定一条重写规则以说服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>

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


1
我解决了一个问题,我必须仅使用上面的安全性部分在查询字符串中支持带有加号的旧版URL,即将allowDoubleEscaping设置为“ True”。
斯蒂芬2012年

我有一个独特的案例-一些旧网址有两个连续的加号,即“ ++”。IIS似乎对此有特殊的规定。有任何想法吗?
boomhauer

@boomhauer,您可能需要编写处理程序...或使用其他网络服务器来托管这些URL?一次,我使Apache mod_rewrite处理了一堆旧URL并将其重定向到各种新位置,这似乎更加灵活。
内森
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.