IIS URLrewrite:如何保留内部重定向的原始主机名?

时间:2017-09-29 19:27:27

标签: iis url-rewriting reverse-proxy

我有一个在一台服务器上运行的Web应用程序,并在另一台服务器上使用带有rewriteURL的IIS作为反向代理。

我配置传入规则以使用Web应用程序服务器的地址重写反向代理地址。这很好。

但是,该应用程序允许用户下载一些内容并将其重定向到下载地址。现在,用户被转发到Web应用服务器的本地IP地址,而不是反向代理的公共地址。

据我所知,我需要编辑出站规则以捕捉到这一点,但我不知道怎么回事。

我按照这里的说明操作 https://docs.microsoft.com/en-us/iis/extensions/url-rewrite-module/modifying-http-response-headers

我当前的重写规则看起来像这样

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="er-platform" stopProcessing="true">
                    <match url="^er-platform(.*)" />
                    <conditions>
                        <add input="{CACHE_URL}" pattern="^(https?)://" />
                    </conditions>
                    <action type="Rewrite" url="{C:1}://192.168.80.6:8443/{R:0}" />
                    <serverVariables>
                        <set name="ORIGINAL_HOST" value="{HTTP_HOST}" />
                    </serverVariables>
                </rule>
            </rules>
            <outboundRules>
                <rule name="er-platform" preCondition="IsRedirection" enabled="true">
                    <match serverVariable="RESPONSE_LOCATION" pattern="^(https?)://[^/]+/(.*)" />
                    <conditions logicalGrouping="MatchAny">
                        <add input="{ORIGINAL_HOST}" pattern=".+" />
                    </conditions>
                    <action type="Rewrite" value="{R:1}://{ORIGINAL_HOST}/{R:2}" />
                </rule>
                <preConditions>
                    <preCondition name="IsRedirection">
                        <add input="{RESPONSE_STATUS}" pattern="3\d\d" />
                    </preCondition>
                </preConditions>
            </outboundRules>
        </rewrite>
    </system.webServer>
</configuration>

在尝试下载内容时,我仍然会被重定向到本地IP。 我如何更改规则才能做到这一点?

谢谢,

托马斯

1 个答案:

答案 0 :(得分:1)

我认为你的出境规则不正确。我有几个猜测它失败的原因。

首先:您的入站规则必须匹配您的出站规则才能生效。这是因为在执行入站规则时会捕获ORIGINAL_HOST。目前,您的入站规则与^er-platform(.*)的网址匹配。我将假设由于这是一个反向代理,它正在工作,因为如果它不是,你将无法启动下载。

第二:输出规则仅在3xx代码上触发。这不是重定向的唯一方法。您可能使用JavaScript重定向。例如。 `window.location =&#39; http://wrongaddress&#39;。在这种情况下,您的出站规则将无效。

调试此操作的后续步骤: 为入站规则启用“日志记录”。 IIS Manager Log rewritten URL checkbox 您的日志将写入%SystemDrive%\ inetpub \ logs \ LogFiles \。验证入站规则是否被命中。

验证线路上发生了什么: Fiddler是了解网络上实际发生情况的绝佳工具。使用此选项确认URL重写规则应该命中。即请求URL与^er-platform(.*)匹配,响应代码在300s内。

除了Fiddler,您还可以使用Chrome开发者工具网络标签。打开“保留日志”&#39;复选框,以便在您重定向后无法清除。验证您认为应该发生的实际情况。