反向代理 - 虚拟目录/子文件夹是否应匹配重写规则

反向代理 - 虚拟目录/子文件夹是否应匹配重写规则

我正在尝试创建一个反向代理,它将把对特定 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=123http://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>

还添加了来自https://blogs.msdn.microsoft.com/friis/2016/08/25/iis-with-url-rewrite-as-a-reverse-proxy-part-2-dealing-with-500-52-status-codes/围绕GZIP

相关内容