包含 + 字符的 URL 的 IIS7 URL 重写中断

Tim*_*ong 6 iis rewrite iis-7.5

我有一个 IIS7 服务器,它充当其他几个 Web 服务器的反向代理。其他服务器在不同的端口上运行,因此 IIS7 服务器提供“友好 URL”,并且所有端口都在 80 端口上。URL 重写用于将请求传递给后端服务器。

其中一种服务器是 TeamCity(持续集成和构建服务器)。该服务器提供了一种下载构建结果(“构建工件”)的方法。通常,这些工件是 zip 存档。这是一个示例网址:

http://build.teamserver.tigranetworks.co.uk/repository/download/bt25/4164:id/ASCOM+Telescope+Driver+for+AWR+6.0.40.825.zip

中的 + 字符ASCOM+Telescope+Driver+for+AWR+6.0.40.825.zip实际上是最终文件名中的空格;TeamCity 服务器放入 + 字符。

单击此链接时,我从 IIS7 服务器收到以下错误:

404 - 未找到文件或目录。

您要查找的资源可能已被删除、更名或暂时不可用。

IIS7 日志文件中出现的实际 URL 是:

/repository/download/bt25/4164:id/ASCOM+Telescope+Driver+for+AWR+6.0.40.825.zip

重写规则匹配模式(.*)并使用

http://localhost:8022/ {R:1}

现在是有趣的事情。如果我回到我的浏览器并编辑掉那些 + 字符,小心地用空格替换它们,那么 URL 就可以工作了!

我的结论是 URL 重写在某种程度上不适用于那些 + 字符。这是一个已知的问题?有什么建议?

Ser*_*kov 5

由于 h0tw1r3 已经回答,您必须禁用 URL 验证。

如果要在IIS 服务器级别执行此操作,请使用以下命令:

%windir%\system32\inetsrv\appcmd set config /section:requestfiltering /allowdoubleescaping:true
Run Code Online (Sandbox Code Playgroud)

如果您只想在应用程序级别禁用它,那么您只需将以下部分添加到您的 web.config 文件中:

<system.webServer>
    <security>
        <requestFiltering allowDoubleEscaping="true" />
    </security>
</system.webServer>
Run Code Online (Sandbox Code Playgroud)


h0t*_*1r3 3

“+”符号实际上不是空格的有效 URL 编码。TeamCity 应将它们编码为 %20。

不管怎样,该错误可能是 IIS7 中常见的requestFiltering 安全设置的结果。

尝试以下命令:

%windir%\system32\inetsrv\appcmd set config /section:requestfiltering /allowdoubleescaping:true
Run Code Online (Sandbox Code Playgroud)

它应该阻止 IIS 对 URL 中带有 + 的任何内容返回 404。