我正在尝试创建一个反向代理,它将把对特定 URL 的所有请求重写到 DMZ 内的另一台服务器。我根据这篇文章完成了设置和配置 https://learn.iis.net/page.aspx/659/reverse-proxy-with-url-rewrite-v2-and-application-request-routing
我的基本设置如下 -
应触发重写的基本 URL -http://MySite/Custom?Data=123
代理 URL -http://MyProxyServer/Service?Data=123
我的问题出在上面两个粗体关键字上!我似乎无法成功地将所有请求重写到新的 URL。
详细解释——
当我使用以下规则时 -
<rule name="ReverseProxy" stopProcessing="true">
<match url="Custom/(.*)" />
<action type="Rewrite" url="http://MyProxyServer/Service{R:1}" />
</rule>
我收到 404 错误,提示http://MySite/Service
未找到!
使用失败的请求日志进行跟踪,我可以看到规则运行正常(新 url 创建正确)但最终请求以 404 错误结束。
事实是,如果我稍微调整规则,一切都会正常。
遵循规则有效 -
<rule name="ReverseProxy" stopProcessing="true">
<match url="Service/(.*)" />
<action type="Rewrite" url="http://MyProxyServer/Service{R:1}" />
</rule>
但我必须将我的基本网址更改http://MySite/Service?Data=123
为http://MySite/Custom?Data=123
那么,IIS 7 中的反向代理实现是否存在限制,我们必须匹配源和代理之间的子目录/虚拟目录名称,还是我的规则不够充分?
答案1
ARR/rewrite 有一个未记录的问题,即它无法映射子文件夹。我添加此内容以供参考,希望它能帮助其他人
我尝试过的一种似乎有效的解决方法是在源 Web 应用程序中创建一个文件夹,然后在该文件夹中添加一个 web.config,其中包含指向目标 Web 应用程序的规则:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="ReverseProxyInboundRule1" stopProcessing="true">
<match url="(.*)" />
<action type="Rewrite" url="http://<<<TARGET_HOSTNAME>>>{R:1}" />
<serverVariables>
<set name="HTTP_X_ORIGINAL_ACCEPT_ENCODING" value="{HTTP_ACCEPT_ENCODING}" />
<set name="HTTP_ACCEPT_ENCODING" value="" />
</serverVariables>
</rule>
</rules>
<outboundRules>
<rule name="RestoreAcceptEncoding" preCondition="RestoreAcceptEncoding">
<match serverVariable="HTTP_ACCEPT_ENCODING" pattern="^(.*)$" />
<action type="Rewrite" value="{HTTP_X_ORIGINAL_ACCEPT_ENCODING}" />
</rule>
<preConditions>
<preCondition name="RestoreAcceptEncoding">
<add input="{HTTP_X_ORIGINAL_ACCEPT_ENCODING}" pattern=".*" />
</preCondition>
</preConditions>
</outboundRules>
</rewrite>
</system.webServer>
</configuration>