IIS7 URL重写包含+字符的URL

我有一个IIS7服务器,作为其他几个Web服务器的反向代理。 其他服务器运行在不同的端口上,所以IIS7服务器提供了“友好的URL”,全部在端口80上。URL重写用于将请求交给后端服务器。

一个这样的服务器是TeamCity(持续集成和构build服务器)。 该服务器提供了一种下载构build结果的方法('构build工件')。 通常这些工件是一个zip压缩文件。 以下是一个示例url:

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中的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

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

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

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

我得出这样的结论:URL重写对于那些+字符不起作用。 这是一个已知的问题? 有什么build议么?

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

无论哪种方式,错误可能是IIS7中的一个共同的请求过滤安全设置的结果。

尝试以下命令:

 %windir%\system32\inetsrv\appcmd set config /section:requestfiltering /allowdoubleescaping:true 

它应该阻止IIS回应URL中的任何内容。

正如h0tw1r3已经回答,你必须禁用URLvalidation。

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

 %windir%\system32\inetsrv\appcmd set config /section:requestfiltering /allowdoubleescaping:true 

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

 <system.webServer> <security> <requestFiltering allowDoubleEscaping="true" /> </security> </system.webServer>