web.config配置HTTP转HTTPS规则对末尾带数字域名失效如何解决
问题诱因
该异常由两类常见原因导致:
- 旧版IIS URL Rewrite 2.0模块存在词法解析bug:当你在重定向目标地址中直接相邻拼接两个服务器变量(当前写法为
{HTTP_HOST}{REQUEST_URI}),如果{HTTP_HOST}解析出的域名值包含紧邻后续变量标识的数字,模块解析器会错误将数字和后续{开头的变量标识识别为带编号的反向引用(比如域名主体为mydomain7时,会把7{REQUEST_URI}误判为不存在的{C:7}/{R:7}反向引用),最终生成错误的重定向地址,导致跳转失效。 - 规则中HTTPS判断的正则为严格精确匹配
^OFF$,部分IIS版本处理含数字域名的请求时,{HTTPS}变量可能返回小写off或带前后空白的异常值,无法命中匹配条件,规则根本不会触发。
可行修复方案
优先推荐使用修正后的规则,覆盖所有异常场景:
<rule name="ssl redirect" enabled="true" stopProcessing="true"> <match url="(.*)" /> <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> <!-- 显式开启忽略大小写,兼容{HTTPS}返回小写值的场景;极端场景可替换为更稳定的端口判断:<add input="{SERVER_PORT}" pattern="^80$" /> --> <add input="{HTTPS}" pattern="^OFF$" ignoreCase="true" /> </conditions> <!-- 域名和路径之间显式加/分隔,用匹配捕获的{R:1}取路径,开启自动拼接查询串,规避相邻变量解析bug --> <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" appendQueryString="true" redirectType="Permanent" /> </rule>
修正逻辑说明:
- 给HTTPS判断显式加*ignoreCase="true"*属性,兼容不同IIS版本的变量返回值差异,避免条件匹配失效
- 域名和请求路径之间显式写入
/作为分隔符,用规则匹配捕获的路径值{R:1}替代直接拼接{REQUEST_URI},彻底切断数字和后续变量标识的相邻关系,解决模块词法解析bug - 开启*appendQueryString="true"*由重写模块自动拼接查询参数,比手动拼接变量的兼容性更强
- 极端场景下可以把HTTPS判断替换为对
{SERVER_PORT}是否为80端口的判断,完全规避{HTTPS}变量取值异常的问题
内容的提问来源于stack exchange,提问作者user3570022
相关产品推荐
相关产品推荐

