web.config rewrite规则如何编写正则匹配*/admin*格式的URL
正确的web.config rewrite匹配规则
首先明确IIS rewrite模块中<match>的url属性匹配逻辑:默认匹配域名后、查询字符串前的路径部分,且自动去掉开头的斜杠,所以正则不需要额外加前导/。
正确的正则表达式
要满足匹配admin作为独立路径段出现、同时排除adminpage这类admin作为前缀的场景,正则写为:
^(.*?/)?admin(/.*)?$
对应web.config配置写法
<match url="^(.*?/)?admin(/.*)?$" ignoreCase="false" />
如果需要URL不区分大小写(通用场景更常用),把ignoreCase改为true即可。
正则逻辑说明
^匹配路径开头(.*?/)?可选匹配admin之前的任意路径段(比如xxx/yyy/这类前缀),问号表示非贪婪匹配,避免不必要的性能消耗admin精确匹配路径段admin(/.*)?可选匹配admin之后的斜杠加任意路径后缀(比如/test、/a/b/c/这类后缀)$匹配路径结尾
匹配验证
命中(合法匹配)
admin→ 对应URLhttp://test.com/adminadmin/→ 对应URLhttp://test.com/admin/admin/test→ 对应URLhttp://test.com/admin/testxxx/admin→ 对应URLhttp://test.com/xxx/adminxxx/admin/grgr/hht/→ 对应URLhttp://test.com/xxx/admin/grgr/hht/
不命中(非法匹配)
- 空路径 → 对应URL
http://test.com adminpage→ 对应URLhttps://test.com/adminpageadminpage/→ 对应URLhttps://test.com/adminpage/xxx/adminpage→ 对应URLhttps://test.com/xxx/adminpage
之前写法失效原因
<match url="(.*)/admin$" ignoreCase="false" />:$限定了admin必须在路径末尾,admin/xxx这类带后缀的路径无法匹配;同时加了前导斜杠不符合IIS的匹配逻辑。<match url="/admin?" ignoreCase="false" />:前导斜杠不符合匹配逻辑;?表示前一个字符n可选,会匹配到admi这类错误内容,也没有限制admin后面不能跟其他非斜杠字符,会误匹配adminpage。<match url=".*/admin?" ignoreCase="false" />:同样存在?的逻辑错误,没有限定admin后面的字符规则,会误匹配adminpage类路径。
内容的提问来源于stack exchange,提问作者Hans Preutz
相关产品推荐
相关产品推荐

