<p>= 优先级最高,精确匹配即终止;~ 和 ~* 优先级次之,按配置顺序从上到下匹配,前者区分大小写,后者不区分;二者仅在无 = 和 ^~ 匹配时生效。</p>

波浪号(~ 和 ~*)和等号(=)在 Nginx 的 location 配置中代表不同匹配类型,它们的优先级有明确顺序:= 最高,~ 和 ~* 次之。这个顺序不取决于配置文件里写的先后,而是由 Nginx 内部匹配机制硬性规定的。
= 精确匹配:一击命中就终止
只要请求 URI 和 location = /xxx 完全一致(包括大小写、结尾斜杠、无多余参数),就立刻选用该块,后续所有 location 规则都不再检查。例如:
-
location = /login { ... }只匹配/login这个完整路径; -
/login?next=/home或/login/都不匹配; - 哪怕同时存在
location /login { ... }或location ~ /login { ... },只要 = 匹配成功,它们全部被跳过。
~ 和 ~*:正则匹配,按配置顺序执行
这两个属于同一优先级层级,但行为略有区别:
-
~是区分大小写的正则匹配; -
~*是不区分大小写的正则匹配; - 它们只在“没有 = 匹配”且“没有更优前缀匹配(如 ^~)”时才参与匹配;
- Nginx 会**从上到下逐条扫描**配置中的 ~ 和 ~* 规则,一旦某条正则成功匹配,就立即采用,不再继续往下看。
比如你写了:
location ~ /api/v\d+/user { ... }<br>location ~* \.(js|css)$ { ... }那么请求 /api/v1/user 会命中第一条;而 /static/MAIN.CSS 因为不区分大小写,会命中第二条 —— 即使它写在后面,也因第一条没匹配上而轮到它。
它们和普通前缀匹配(无修饰符)的关系
= 和 ~ / ~* 并不是孤立比较的。Nginx 实际匹配流程是分阶段的:
- 第一阶段:检查所有
=规则,有就用,结束; - 第二阶段:收集所有无修饰符(如
location /api)和^~规则,找出**最长前缀匹配项**; - 若最长项带
^~,直接采用,跳过正则; - 若最长项不带
^~,则进入第三阶段:按顺序扫描 ~ 和 ~*,找到第一个匹配的正则就用; - 都没匹配上,才回落到第二阶段选中的最长前缀项。
所以 = 总是赢在第一步;~ 和 ~* 虽比普通前缀“灵活”,但必须等前缀筛选完、且没遇到 ^~ 才有机会出手。


















