我正在尝试使用 URL 重写来重写 Azure WebApp (Windows) 中的 HTTP_HOST 和 REQUEST URL。 WebApp 前面有一个应用程序网关,它重写了请求 FQDN。
我想用 URL 重写做什么 (1) 如果X_ORIGINAL_HOST中有值,则将X_ORIGINAL_HOST的值赋给HTTP_HOST。 (2) 如果请求 URL 不是以 /en /ja-JP 开头,请在 URL 开头添加 /ja-JP/。
我写的规则如下
<rule name="Rule1">
<match url="(.*)" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
<add input="{HTTP_X_ORIGINAL_HOST}" pattern="^$" negate="true" />
</conditions>
<serverVariables>
<set name="HTTP_HOST" value="{HTTP_X_ORIGINAL_HOST}" />
</serverVariables>
</rule>
<rule name="Rule2" stopProcessing="false">
<match url="^(?!(en|ja-JP)(\/|$)).*$" />
<conditions>
<add input="{REQUEST_URI}" pattern="^/.*$" ignoreCase="true" />
</conditions>
<action type="Rewrite" url="/ja-JP/{REQUEST_URI}" appendQueryString="true" />
</rule>
但是,当第二条规则启用时, HTTP_HOST 重写似乎已恢复。 另一方面,当第二条规则被注释掉时, HTTP_HOST 重写已启用。
事实上,当我发现踪迹时, 当启用第二条规则时, GENERAL_SET_REQUEST_HEADER 在 URL_REWRITE_END 之前输出,Headname="HOST" HeaderValue="由第一条规则重写的主机名",Replace="true"。
如何修改重写规则才能使第一条和第二条规则有效?
我将不胜感激任何智者的帮助。
出现此问题的原因是第二个规则在第一个规则之后处理请求,并且似乎覆盖了第一个规则中 HTTP_HOST 重写设置的值。为了使这两个规则正常工作,您需要确保在应用第二个规则时第一个规则中的 HTTP_HOST 值仍然存在。
了解更多详细信息:https://learn.microsoft.com/en-us/iis/extensions/url-rewrite-module/url-rewrite-module-configuration-reference https://learn.microsoft.com/en-us/iis/extensions/url-rewrite-module/url-rewrite-module-configuration-reference#Using_Server_Variables