IIS URL Rewrite修改URL开头时查询串域名未替换问题咨询
问题根因
你写的规则没有达到预期,核心是两个默认逻辑和配置缺失导致的:
- IIS URL Rewrite模块默认会自动把原始请求的查询字符串追加到你配置的跳转URL末尾,不会自动修改查询串内部的文本内容
- 现有规则仅对请求域名、路径部分做了匹配替换,没有处理查询字符串中
host参数携带的旧域名,也没有关闭自动追加查询串的开关,最终导致查询串里的旧域名被原样带了过去。
正确配置
将原有重写规则替换为以下内容即可实现需求:
<rewrite> <rules> <rule name="redirect app" stopProcessing="true"> <match url="^(.*)$" /> <conditions> <add input="{HTTP_HOST}" pattern="^web1\.domain\.org$" /> <add input="{QUERY_STRING}" pattern="host=https://web1\.domain\.org(/[^&]*)&?(.*)" /> </conditions> <action type="Redirect" url="https://web2.domain.org/{R:1}?host=https://web2.domain.org{C:1}&{C:2}" appendQueryString="false" redirectType="Temporary" /> </rule> </rules> </rewrite>
规则说明
^(.*)$匹配原始请求的完整路径,捕获组{R:1}会保留所有路径内容,不会出现路径丢失的问题- 第一个条件校验请求Host为旧域名,避免其他域名的请求被误跳转
- 第二个条件拆分原始查询串:
{C:1}捕获host参数中旧域名后的路径片段,{C:2}捕获host参数之外的所有其他请求参数,比如示例中的thisid=zzzz appendQueryString="false"是必须配置的项,作用是关闭重写模块自动拼接原始查询串的默认行为,完全使用我们替换完成后的新查询串- 初始调试阶段建议用
redirectType="Temporary"(302跳转),确认所有跳转逻辑符合预期后,再改成Permanent(301跳转)利用缓存提升访问速度。
内容的提问来源于stack exchange,提问作者stratman
相关产品推荐
相关产品推荐

