Windows Server2022下IIS10的HTTP转HTTPS重写规则失效问题
更新时间:2024年6月6日
我在Windows Server 2022系统的IIS 10中,尝试用URL Rewrite模块配置HTTP转HTTPS的重写规则,但规则没有生效。
我的规则配置
规则定义在WebAppDemo应用的web.config文件中,路径为:inetpub/wwwroot/WebAppDemo/web.config
注:规则未实现HTTP到HTTPS的跳转,请继续阅读...
<system.webServer> <rewrite> <rules> <rule name="WebAppDemoHttpsRedirect" stopProcessing="true"> <match url="/WebAppDemo(/.*)?$" /> <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> <add input="{HTTPS}" pattern="^OFF$" /> </conditions> <action type="Redirect" url="https://{HTTP_HOST}:9443{REQUEST_URI}" /> </rule> </rules> </rewrite> </system.webServer>
这个规则无法将HTTP请求重定向到HTTPS。我不确定哪里配置错了,已经回收了“Default Web Site”下WebAppDemo的应用池,是否必须重启“Default Web Site”才能让规则生效?我尽量不想这么做...
环境配置
Default Web Site WebAppDemo 绑定: http:80 访问地址: http://my-host-name.myorg.com/WebAppDemo/Default.aspx New Web Site WebAppDemo 绑定: https:9443(自定义端口) 主机名: my-host-name.myorg.com 端口:9443 服务器名称标识(已勾选复选框) 访问地址: https://my-host-name.myorg.com:9443/WebAppDemo/Default.aspx 注意: 两个站点中的WebAppDemo指向同一物理目录 测试操作:用Chrome浏览器访问 http://my-host-name.myorg.com/WebAppDemo/Default.aspx 结果:未重定向到HTTPS站点。
问题分析与修复方案
1. 匹配规则错误是核心问题
你的<match url>配置了/WebAppDemo(/.*)?$,但IIS中{URL}变量(也就是<match url>匹配的内容)不包含应用程序的虚拟路径前缀。当请求http://my-host-name.myorg.com/WebAppDemo/Default.aspx时,{URL}的值是/Default.aspx,而不是/WebAppDemo/Default.aspx,所以规则根本匹配不上,自然不会触发重定向。
修改匹配规则为:
<match url="(.*)" />
这个配置会匹配所有请求路径,确保只要是HTTP请求就会被捕获。
2. 重定向URL优化
当前重定向URL格式没问题,但建议加上redirectType="Permanent"返回301永久重定向,对SEO和浏览器缓存更友好:
<action type="Redirect" url="https://{HTTP_HOST}:9443{REQUEST_URI}" redirectType="Permanent" />
3. 规则生效验证与重启问题
回收应用池通常已经足够让web.config的修改生效,不需要重启站点。如果回收后仍不生效,可以尝试:
- 检查URL Rewrite模块是否正确安装(在IIS管理器站点的功能视图中确认有URL Rewrite图标)
- 查看IIS日志(默认路径
inetpub/logs/LogFiles),确认请求是否命中规则 - 清除浏览器缓存后用
Ctrl+Shift+R强制刷新测试
4. 额外优化:避免循环重定向
由于两个站点共享同一物理目录,后续HTTPS站点的web.config也会加载这条规则,建议添加条件排除HTTPS端口,防止循环重定向:
<conditions logicalGrouping="MatchAll" trackAllCaptures="false"> <add input="{HTTPS}" pattern="^OFF$" /> <add input="{SERVER_PORT}" pattern="^9443$" negate="true" /> </conditions>
修复后的完整规则
<system.webServer> <rewrite> <rules> <rule name="WebAppDemoHttpsRedirect" stopProcessing="true"> <match url="(.*)" /> <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> <add input="{HTTPS}" pattern="^OFF$" /> <add input="{SERVER_PORT}" pattern="^9443$" negate="true" /> </conditions> <action type="Redirect" url="https://{HTTP_HOST}:9443{REQUEST_URI}" redirectType="Permanent" /> </rule> </rules> </rewrite> </system.webServer>
内容的提问来源于stack exchange,提问作者Tech with Thiru

