Azure IIS非根URL非www转www及SSL重定向失效问题
问题成因
非根路径下www重定向失效、静态资源跳转正常的核心原因有两点:
- Azure门户自带的「HTTPS ONLY」重定向运行在平台前端层,优先级远高于你配置的IIS重写规则。它只会把HTTP请求原样跳转到同域名的HTTPS地址,不会处理www前缀;对于非根路径的动态请求,完成这层跳转后,请求到达应用层时会被部署的应用框架(ASP.NET Core、Node.js、PHP等)的路由/HTTPS中间件提前接管响应,根本没有走到你配置的IIS www重写规则。
- 静态资源请求不会进入应用业务路由管线,直接由IIS静态模块处理,所以能正常命中你写的重写规则,这也是静态资源跳转正常、动态路由跳转失效的直接原因。
另外你现有规则没有指定重定向类型,默认返回302临时重定向,很容易被浏览器缓存错误的跳转结果,干扰测试判断。
解决方法
按以下步骤操作即可完全符合预期重定向规则:
- 先关闭Azure面板的「HTTPS ONLY」开关,避免平台层的高优先级重写打乱自定义规则逻辑,所有跳转统一交给IIS URL Rewrite处理,减少多轮重定向。
- 找到站点根目录下的
web.config文件,把<system.webServer>节点下的<rewrite>配置段替换为以下内容,注意把example.com替换成你自己的实际域名:
<rewrite> <rules> <!-- 一步跳转:根域名(无论HTTP/HTTPS)直接跳转到带www的HTTPS地址 --> <rule name="Redirect Root to WWW HTTPS" stopProcessing="true"> <match url="(.*)" /> <conditions logicalGrouping="MatchAll"> <add input="{HTTP_HOST}" pattern="^example\.com$" /> </conditions> <action type="Redirect" url="https://www.example.com/{R:1}" redirectType="Permanent" /> </rule> <!-- 带www域名的HTTP请求强制跳HTTPS --> <rule name="Force WWW HTTPS" stopProcessing="true"> <match url="(.*)" /> <conditions logicalGrouping="MatchAll"> <add input="{HTTPS}" pattern="off" ignoreCase="true" /> <add input="{HTTP_HOST}" pattern="^www\.example\.com$" /> </conditions> <action type="Redirect" url="https://www.example.com/{R:1}" redirectType="Permanent" /> </rule> </rules> </rewrite>
- 检查应用代码配置:如果你用的是ASP.NET Core等自带HTTPS重定向中间件的框架,把代码里的
app.UseHttpsRedirection()相关配置注释掉,不要在应用层重复做跳转逻辑,避免提前接管请求导致IIS规则不生效;其他技术栈同理,删除代码里写死的域名、HTTPS跳转逻辑,统一由IIS规则处理。 - 重启Azure Web App实例,测试时优先用curl、Postman等工具查看响应的Location头验证结果,不要直接用浏览器测试——301永久重定向会被浏览器强缓存,之前的错误跳转记录会导致你看到不符合预期的结果,测试前需要清空浏览器缓存。
该配置下所有场景最多只会触发1次重定向,性能比开启平台HTTPS ONLY+单独配置www规则的方案更好。
内容的提问来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

