Azure站点Web.Config配置:实现强制HTTPS与非www跳转的规则问题
现有配置的问题定位
- 第一版配置无法实现去www的核心原因:
- 处理www剥离的规则,跳转目标直接复用原主机变量
{HTTP_HOST},根本没有对域名做去www处理,等于跳转后地址的www前缀完全没变化 - 规则流转逻辑错误:www跳转规则设置
stopProcessing="false",跳转到带www的地址后还会继续走HTTPS跳转规则,始终无法落到非www的目标状态 - HTTPS跳转规则存在冗余的重复条件,两个对
{HTTPS}的判断没有实际作用
- 处理www剥离的规则,跳转目标直接复用原主机变量
- 第二版配置出现无限重定向的核心原因:
- 条件组错误使用
MatchAny逻辑,叠加了一个未设置匹配规则的{HTTPS}判断,导致所有请求都会满足触发条件 - 跳转目标没有改写主机头为非www地址,不管请求被重定向到哪里,都会再次命中规则,最终形成循环跳转
- 条件组错误使用
可直接落地的有效配置
将web.config中对应的rewrite节点替换为以下代码即可实现预期跳转效果:
<rewrite> <rules> <clear/> <!-- 规则1:处理所有带www前缀的请求,直接跳转至非www的HTTPS地址 --> <rule name="Strip www prefix and force HTTPS" stopProcessing="true"> <match url="(.*)" /> <conditions trackAllCaptures="true"> <add input="{HTTP_HOST}" pattern="^www\.(.+)$" /> </conditions> <!-- 从正则匹配结果中提取去掉www的域名,拼接为标准跳转地址 --> <action type="Redirect" url="https://{C:1}{REQUEST_URI}" redirectType="Permanent" appendQueryString="true" /> </rule> <!-- 规则2:处理所有HTTP协议的非www请求,跳转至对应HTTPS地址 --> <rule name="Force HTTPS for non-www requests" stopProcessing="true"> <match url="(.*)" /> <conditions> <add input="{HTTPS}" pattern="^OFF$" ignoreCase="true" /> </conditions> <action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" redirectType="Permanent" appendQueryString="true" /> </rule> </rules> </rewrite>
配置匹配逻辑验证
替换后会完美匹配预期的三类跳转场景,且不会产生多余跳转或循环:
- 访问
http://example.com:不命中www剥离规则,直接走HTTPS强制规则,跳转至https://example.com - 访问
http://www.example.com:直接命中www剥离规则,一步跳转至https://example.com,无需重复跳转 - 访问
https://www.example.com:直接命中www剥离规则,一步跳转至https://example.com - 所有跳转后的目标地址均满足「非www前缀+HTTPS协议」的最终状态,不会再次触发跳转规则
内容的提问来源于stack exchange,提问作者adam
相关产品推荐
相关产品推荐

