首页 > 解决方案 > 如何在重写期间强制 IIS 为 http 主机标头使用特定值

问题描述

我正在尝试创建一个重写规则,将网站配置为用作反向代理,但我在将主机 http 标头设置为与重写中使用的域不同的预定义值时遇到了一些问题(目标是使用 IIS 作为反向代理,将 URL 转发到具有自定义主机值的 sendgrid)。

为了说明问题,我使用绑定 url.com 和 sendgrid.net 创建了 2 个名为 url 和 sendgrid 的网站(我在 hosts 文件中为这些名称添加了自定义条目,以便解析名称) . 现在,我需要将在 url 网站上收到的所有请求重定向到 sendgrid 网站,确保对 sendgrid 网站的请求将主机 http 标头设置为 url.com。我首先向 url 网站添加了一个重写规则,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="ReverseProxyInboundRule1" stopProcessing="true">
                    <match url="(.*)" />
                    <conditions>
                        <add input="{CACHE_URL}" pattern="^(https?)://" />
                    </conditions>
                    <action type="Rewrite" url="http://sendgrid.net/{R:1}" logRewrittenUrl="true" />
                    <serverVariables>
                        <set name="HTTP_HOST" value="url.madeira.gov.pt" />
                    </serverVariables>
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>

applicationhost.config 文件也已更新,因此可以更改 HTTP_HOST:

<location path="url">
    <system.webServer>
        <rewrite>
            <allowedServerVariables>
                <add name="HTTP_HOST" />
            </allowedServerVariables>
        </rewrite>
    </system.webServer>
</location>

为了查看发生了什么,我激活了失败的请求跟踪,我注意到通过前面的规则定义的主机头文件没有应用。我可以看到已经处理了规则并且处理了 HTTP_HOST 标头(SET_SERVER_VARIABLE),但是当请求被重写时,它总是将 http 主机设置为 sendgrid.net(而不是将其设置为 url.com):

重写期间应用的主机头值

那么,当 IIS 网站配置为用作反向代理时,有没有办法强制对主机标头使用特定值?

标签: iisurl-rewritinghttp-headers

解决方案


尝试按照以下步骤将 preserveHostHeader 设置为 true:

1)打开IIS管理器,选择服务器节点。

2)双clic配置管理器。

3)从部分下拉选择 system.webServer/proxy

4)将preserveHostHeader设置为true

在此处输入图像描述

注意:如果您尝试更改请求标头,则无法使用 iis URL 重写规则。


推荐阅读