You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure Windows WebApp中URL Rewrite规则冲突问题求助

Azure WebApp URL Rewrite规则冲突:HOST头重置问题修复

问题背景

在Azure Windows WebApp环境中使用URL Rewrite,前端部署Application Gateway改写请求FQDN,需实现两个需求:

  • 当请求头存在X_ORIGINAL_HOST时,将HTTP_HOST设为该值;
  • 若请求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> 

启用Rule2后,Rule1设置的HTTP_HOST会被重置,注释Rule2则恢复正常。跟踪发现URL_REWRITE_END事件前HOST头被重置。

问题原因

Rule2的Rewrite动作会触发IIS重新初始化请求上下文,导致Rule1中已修改的HTTP_HOST服务器变量被覆盖为原始请求的HOST值。

修复方案

通过在Rule2中同步设置HTTP_HOST变量,并优化Rule1的动作配置,确保两次规则执行都能保留HOST头修改:

<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> 
 <action type="None" /> <!-- 显式声明无动作,避免默认处理逻辑干扰 -->
</rule>

<rule name="Rule2" stopProcessing="false">
 <match url="^(?!(en|ja-JP)(/|$)).*$" />
 <conditions>
  <add input="{REQUEST_URI}" pattern="^/.*$" ignoreCase="true" />
  <add input="{HTTP_X_ORIGINAL_HOST}" pattern="^$" negate="true" /> <!-- 仅当存在X_ORIGINAL_HOST时同步设置 -->
 </conditions> 
 <action type="Rewrite" url="/ja-JP/{REQUEST_URI}" appendQueryString="true" /> 
 <serverVariables> <!-- 重写URL后重新设置HOST变量 -->
    <set name="HTTP_HOST" value="{HTTP_X_ORIGINAL_HOST}" /> 
 </serverVariables> 
</rule>

关键要点

  1. Rule1添加action type="None":确保规则执行后不会触发默认的请求流转,避免变量被提前重置。
  2. Rule2同步设置HTTP_HOST:由于URL重写会重建请求上下文,需要在重写动作后再次注入HOST值。
  3. 确认服务器变量权限:在Azure门户的WebApp配置中,进入URL Rewrite -> Server Variables,将HTTP_HOST添加到允许修改的变量列表中,否则服务器变量设置会失效。

内容的提问来源于stack exchange,提问作者Kato Tetsuya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 20:04:58