IIS URL重写临时修复:在双斜杠间添加0
嘿,我来帮你搞定这个IIS URL重写的问题!你之前的规则没生效,主要是因为通配符(Wildcard)模式的匹配能力有限,再加上捕获组的引用写法不对。咱们一步步来修正:
解决IIS URL重写插入0到双斜杠之间的问题
问题分析
你需要把URL里的//替换成/0/(比如把https://example.com/PortalWebService/api/List/getpdf/10/1//16/en-ca/改成带/0/的版本),但原来用Wildcard模式的规则没法精准捕获双斜杠前后的内容,而且捕获组引用错误(Wildcard模式用{C:N}而非{R:N},但正则模式更适合这个场景)。
修正后的完整重写规则
用正则表达式模式来实现,这是最可靠的方式:
<rewrite> <rules> <rule name="Insert 0 between double slashes" stopProcessing="true"> <match url="^(.*)//(.*)$" /> <action type="Rewrite" url="{R:1}/0/{R:2}" appendQueryString="true" logRewrittenUrl="true" /> </rule> </rules> </rewrite>
规则细节解释
- 模式选择:默认的
ECMAScript(正则)模式比Wildcard更灵活,能精准定位双斜杠的位置 - 匹配逻辑:
^(.*)//(.*)$会把双斜杠//之前的所有内容捕获到{R:1},之后的内容捕获到{R:2} - 重写动作:把URL拼接成
{R:1}/0/{R:2},刚好在双斜杠中间插入了0 - stopProcessing:设为
true可以避免后续规则干扰这次重写;如果你的URL可能出现多次双斜杠(比如//a//b),可以改成false,让IIS反复应用规则直到所有双斜杠都被处理
针对你示例URL的效果
原URL:https://example.com/PortalWebService/api/List/getpdf/10/1//16/en-ca/
重写后会变成:https://example.com/PortalWebService/api/List/getpdf/10/1/0/16/en-ca/
处理多次双斜杠的扩展规则
如果需要处理URL中多处出现的//,用这个循环版本:
<rewrite> <rules> <rule name="Insert 0 between double slashes - Loop" stopProcessing="false"> <match url="^(.*)//(.*)$" /> <action type="Rewrite" url="{R:1}/0/{R:2}" appendQueryString="true" logRewrittenUrl="true" /> </rule> </rules> </rewrite>
内容的提问来源于stack exchange,提问作者David Cyr




