IIS下使用Rewrite Map配置Rewrite Rule的问题求助
解决IIS中Rewrite Map配合Rewrite Rule的重写问题
嘿,看了你的配置,我马上发现了几个可能导致规则不生效的点,帮你一步步修复:
核心问题:大小写不匹配
你的Rewrite Map里的key是小写的chile和japan,但请求的URL里是/Japan/test.html、/Chile/test.html这种首字母大写的路径。IIS的Rewrite Map默认是大小写敏感的,所以根本匹配不上对应的value。
修复方案:统一转为小写匹配
修改规则里的conditions部分,把捕获到的国家名称转为小写后再去Map里查找:
<conditions> <add input="{Sites:{ToLower:{R:1}}}" pattern="(.+)" /> </conditions>
{ToLower:{R:1}}这个内置函数会把{R:1}捕获到的Japan转成japan,完美匹配Map里的key。
确保Rewrite Map的位置正确
很多人会忽略这点:Rewrite Map必须放在<rewrite>节点下的<rewriteMaps>里,而且要放在<rules>节点之前,不然规则找不到Map。正确的web.config结构应该是这样的:
<system.webServer> <rewrite> <!-- 先放Rewrite Maps --> <rewriteMaps> <rewriteMap name="Sites"> <add key="chile" value="cl" /> <add key="japan" value="jp" /> <!-- 后续加更多国家直接在这里加就行 --> </rewriteMap> </rewriteMaps> <!-- 再放Rules --> <rules> <rule name="Rewrite sites" enabled="true" stopProcessing="true"> <match url="^/(.*)/test.html$" /> <conditions> <add input="{Sites:{ToLower:{R:1}}}" pattern="(.+)" /> </conditions> <action type="Rewrite" url="{C:1}/en/simple-test" appendQueryString="false" /> </rule> </rules> </rewrite> </system.webServer>
可选:让URL匹配不区分大小写
如果想兼容各种大小写的请求(比如/JAPAN/test.html或者/japan/test.html),可以给<match>标签加上ignoreCase="true":
<match url="^/(.*)/test.html$" ignoreCase="true" />
测试小技巧
用IIS管理器里的URL重写测试工具(选中网站→打开URL Rewrite→右侧点击「测试模式」),输入/Japan/test.html,就能看到是否正确捕获到参数,以及Rewrite Map是否返回了对应的jp,快速定位问题。
另外别忘了确认服务器上已经安装了IIS的URL Rewrite模块,没装的话一切都是白搭哦!
内容的提问来源于stack exchange,提问作者Dawid Rutkowski
相关产品推荐
相关产品推荐

