MarkLogic Rewriter URI模式匹配机制及示例匹配异常咨询
MarkLogic Rewriter URI模式匹配机制与常见问题解答
一、为什么精确规则没匹配上?
MarkLogic Rewriter的规则是按配置文件里的定义顺序从上到下匹配,只要找到第一个符合条件的规则就立即停止,不会继续检查后面的规则。你遇到的情况就是^/(.+)$这个更宽泛的规则排在了^/shakespeare/(.+)$前面,所以先被匹配到了。解决办法很简单:把更精确的规则挪到配置文件的更靠前位置。
二、正则转义的问题
MarkLogic Rewriter用的是XQuery正则表达式语法,不是常见的PCRE(Perl兼容正则)。在这个语法里,/不属于特殊字符,完全不需要转义。你写的^(\/openapi\/.+.yml)$里的\/会被当成字面量\/来匹配,自然找不到正常的/路径;而^(/openapi/.+.yml)$里的/直接匹配路径中的斜杠,所以能正常工作。
三、匹配/shakespeare/hamlet的正确正则
根据XQuery正则语法,有几种实用写法:
- 完全精确匹配:
^/shakespeare/hamlet$(只匹配这个特定URI) - 匹配
/shakespeare/下的任意子路径:^/shakespeare/.+$(比如/shakespeare/othello这类也能匹配) - 捕获子路径的版本:
^/shakespeare/(.+)$(和你原本的写法一致,只要规则顺序正确就能生效)
四、MarkLogic Rewriter URI匹配核心机制
- 匹配顺序优先:规则从上到下依次检查,第一个匹配的规则直接生效,后续规则全部被忽略。
- XQuery正则语法约束:仅
.*+?|()[]{}^$\属于特殊字符,/无需转义;默认区分大小写,如需忽略可在规则后加flags="i"。 - 匹配范围限定:只匹配请求的路径部分(不包含查询参数、锚点),比如请求
/shakespeare/hamlet?foo=bar,只会用/shakespeare/hamlet来匹配规则。 - 锚点使用建议:务必加上
^(字符串开头)和$(字符串结尾),避免出现部分匹配的意外情况。比如不加$的话,^/shakespeare会匹配所有以/shakespeare开头的URI,包括/shakespeare/othello/act1这类更长的嵌套路径。
内容的提问来源于stack exchange,提问作者David Steiner
相关产品推荐
相关产品推荐

