nginx location匹配优先级由规则类型决定:=最高且立即终止;^~匹配开头并跳过正则;~和~*按书写顺序取首个匹配;普通前缀取最长且靠前者;/为兜底。

nginx 的 location 匹配优先级不是靠“记住顺序”硬背,而是靠理解每种规则的触发逻辑和终止行为。用对的关键,在于明确你要控制什么:是精确跳转、静态资源加速、还是动态后端路由。
精确匹配(=):只认完全一样的路径
它优先级最高,命中就停,不看后面任何规则。适合首页、登录页、健康检查等固定入口。
- 写法:
location = /health { return 200 "OK"; } - 只匹配
/health,不匹配/health/、/health?id=1或/healthz - 注意:查询参数(? 后面)不影响匹配,
/login?next=/home仍算匹配location = /login
强制前缀匹配(^~):匹配开头 + 跳过正则
适用于高频静态资源目录,比如 /static/、/assets/。它比普通前缀更“坚决”,一旦匹配,连后面的正则规则都不再检查。
- 写法:
location ^~ /static/ { alias /var/www/static/; } - 匹配
/static/logo.png、/static/css/app.css,但不匹配/static(结尾没斜杠) - 即使你后面写了
location ~ \.png$ { ... },只要 URI 以/static/开头,就不会进那个正则块
正则匹配(~ 和 ~*):按书写顺序找第一个
区分大小写(~)或不区分(~*),从上到下逐条试,遇到第一个匹配就执行并停止。适合扩展名、API 版本、路径模式等灵活场景。
- 写法示例:
location ~* \.(js|css|woff2?)$ { expires 1y; } -
~*不区分大小写,/A.Png和/b.JPG都能命中 - 必须放在
^~块之后、普通前缀之前才合理;否则可能被更高优先级规则截断 - 避免把低频正则写在前面,高频的(如
.jpg)尽量靠前,减少遍历开销
普通前缀匹配(无修饰符)和兜底(/):按最长、最靠前原则
没有修饰符的 location /api/ 或 location /blog,属于“最长前缀胜出”。多个都匹配时,选定义在配置文件里更靠前的那个。
-
location /api/v2/比location /api/更长,所以/api/v2/users会优先进入前者 -
location /是最后防线,所有其他规则都没中时才生效,常用来 proxy_pass 到主应用 - 注意:
location /admin会同时匹配/admin和/admin/xxx,如果只想匹配目录,应写成location /admin/











