我有一台 IIS7 服务器,它充当其他几台 Web 服务器的反向代理。其他服务器在不同的端口上运行,因此 IIS7 服务器提供“友好 URL”,并且全部在端口 80 上。URL 重写用于将请求传递给后端服务器。
TeamCity(持续集成和构建服务器)就是这样一个服务器。该服务器提供了一种下载构建结果(“构建工件”)的方法。通常,这些工件是一个 zip 存档。以下是示例 URL:
中的 + 字符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://本地主机:8022/{回复:1}
现在有趣的事情来了。如果我回到浏览器并删除那些 + 字符,小心地用空格替换它们,那么 URL 就可以正常工作了!
我得出的结论是,URL 重写对这些 + 字符不起作用。这是一个已知问题吗?有什么建议吗?
答案1
“+”符号实际上不是空格的有效 URL 编码。TeamCity 应该将其编码为 %20。
无论如何,错误可能是由于一个常见的requestFiltering 安全设置在 IIS7 中。
尝试以下命令:
%windir%\system32\inetsrv\appcmd set config /section:requestfiltering /allowdoubleescaping:true
它应该阻止 IIS 对 URL 中带有 + 的任何内容返回 404。
答案2
正如 h0tw1r3 已经回答的那样,您必须禁用 URL 验证。
如果你想在IIS 服务器级别然后使用以下命令:
%windir%\system32\inetsrv\appcmd set config /section:requestfiltering /allowdoubleescaping:true
如果你只想禁用它应用程序级别,那么您只需要将以下部分添加到您的 web.config 文件中:
<system.webServer>
<security>
<requestFiltering allowDoubleEscaping="true" />
</security>
</system.webServer>