IIS URL Rewrite规则在URL无尾部斜杠时不触发的解决方法
IIS URL Rewrite规则无法匹配无尾部斜杠的URL问题
当前配置的规则
<rule name="MyRule" patternSyntax="ECMAScript" stopProcessing="true"> <match url="Develop([/]?.*)" /> <conditions logicalGrouping="MatchAll" trackAllCaptures="false" /> <action type="Rewrite" url="http://localhost:8081{R:1}" logRewrittenUrl="false" /> </rule>
重写成功的场景
- https://mysite/Develop/
- https://mysite/Develop/Some/Any/Stuff
重写失败的场景
- https://mysite/Develop(URL末尾不带斜杠)
尝试过的无效规则
<rule name="MyRule0" stopProcessing="true"> <match url="^Develop$" /> <conditions logicalGrouping="MatchAll" trackAllCaptures="false" /> <action type="Rewrite" url="http://localhost:8081/" /> </rule>
解决方案1:调整原规则正则,覆盖无斜杠场景
直接修改原规则的匹配正则,让它同时兼容有无斜杠的情况:
<rule name="MyRule" patternSyntax="ECMAScript" stopProcessing="true"> <match url="^Develop(/.*)?$" /> <conditions logicalGrouping="MatchAll" trackAllCaptures="false" /> <action type="Rewrite" url="http://localhost:8081{R:1}" logRewrittenUrl="false" /> </rule>
这个正则的逻辑:
^Develop匹配开头的固定字符串(/.*)?匹配可选的斜杠+任意路径(包括空,对应无斜杠的情况)$匹配URL结尾
无论请求是Develop、Develop/还是Develop/xxx,都会被匹配,无斜杠场景下R:1为空,重写后就是http://localhost:8081。
解决方案2:禁用IIS自动目录斜杠重定向
如果Develop是服务器上的物理目录,IIS默认会把无斜杠的/Develop自动301重定向到/Develop/,导致你的Rewrite规则根本没机会处理无斜杠请求。
在web.config的<system.webServer>节点下添加配置禁用该行为:
<directoryBrowse enabled="false" /> <rewrite> <rules> <!-- 放置你的Rewrite规则 --> </rules> </rewrite>
解决方案3:调整规则顺序(保留两条规则的情况)
如果不想修改原规则,确保MyRule0放在MyRule前面,让它优先匹配无斜杠的场景:
<rule name="MyRule0" stopProcessing="true"> <match url="^Develop$" ignoreCase="true" /> <conditions logicalGrouping="MatchAll" trackAllCaptures="false" /> <action type="Rewrite" url="http://localhost:8081/" /> </rule> <rule name="MyRule" patternSyntax="ECMAScript" stopProcessing="true"> <match url="Develop([/]?.*)" /> <conditions logicalGrouping="MatchAll" trackAllCaptures="false" /> <action type="Rewrite" url="http://localhost:8081{R:1}" logRewrittenUrl="false" /> </rule>
规则按顺序执行,MyRule0匹配到无斜杠的请求后直接停止处理,其他场景交给MyRule。
内容的提问来源于stack exchange,提问作者ElCondor1969
相关产品推荐
相关产品推荐

