我正在努力将 IIS 设置为反向代理。我已设置了两个内部站点(由 IIS 提供服务),分别称为 Payroll 和 Webmail,以及一个外部站点(由不同的 Web 服务器提供服务),分别称为 IPS。这三个站点都在本地主机上,但 Payroll 绑定到端口 12084,Webmail 绑定到端口 12085,IPS 绑定到端口 2080。然后我创建了三个入站规则,将 xyz.com/ips/、xyz.com/payroll/ 和 xyz.com/webmail/ 定向到各自的服务器。所有这些都运行正常。
<rules>
<rule name="Reverse Proxy to ips" enabled="true"
stopProcessing="true">
<match url="^ips/(.*)" />
<action type="Rewrite" url="http://localhost:2080/{R:1}" />
<serverVariables>
<set name="HTTP_ACCEPT_ENCODING" value="" />
</serverVariables>
</rule>
<rule name="Reverse Proxy to webmail" stopProcessing="true">
<match url="^webmail/(.*)" />
<action type="Rewrite" url="http://localhost:12084/{R:1}" />
<serverVariables>
<set name="HTTP_ACCEPT_ENCODING" value="" />
</serverVariables>
</rule>
<rule name="Reverse Proxy to payroll" stopProcessing="true">
<match url="^payroll/(.*)" />
<action type="Rewrite" url="http://localhost:12085/{R:1}" />
<serverVariables>
<set name="HTTP_ACCEPT_ENCODING" value="" />
</serverVariables>
</rule>
</rules>
然后,我编写了一条出站规则,该规则应修补 URL,以便它们可以从外部客户端工作。
<rule name="Add application prefix" preCondition="IsHTML">
<match filterByTags="A, Area, Base, Form, Frame, Head, IFrame,
Img, Input, Link, Script" pattern="^/(.*)" />
<conditions>
<add input="{URL}" pattern="^/(webmail|payroll|ips)/.*" />
</conditions>
<action type="Rewrite" value="/{C:1}/{R:1}" />
</rule>
<preConditions>
<preCondition name="IsHTML">
<add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/html" />
</preCondition>
</preConditions>
问题就出在这里。Payroll 和 Webmail 运行良好:它们是测试站点,只包含指向自身的 href,修补正确。然而,IPS 则不同。您会看到,IPS/index.html 包含指向 /html/index.php 的重定向。
<meta HTTP-EQUIV="REFRESH" content="0; url=/html/index.php">
现在我的问题来了。由于我不完全理解的原因,这个重定向没有得到修补,结果客户端最终进入了“永恒的牧场”。
我怀疑出站规则仅适用于 IIS 本身提供服务的站点,但不会影响外部服务器。我进一步怀疑,我可以通过将 IPS(localhost:2080)定义为“服务器场”中的服务器,并相应地调整出站规则来实现这一点。我想知道上述内容是否正确,如果正确,应该如何修补出站规则。