Nginx location匹配优先级为:先=精确匹配,再选最长前缀(^~或无修饰符),^~命中即停,普通前缀则继续按序匹配正则,全失败时用location /兜底。

直接在 server 块里写 location 指令就行,核心是理解修饰符含义和匹配优先级,不复杂但容易忽略细节。
基础语法与常用修饰符
location 的基本格式是:location [修饰符] 路径 { ... }。修饰符决定怎么比,路径是 URI 开头部分。常用修饰符有:
-
=:精确匹配,URI 必须完全一致(如
location = /login只响应/login,不响应/login/或/login?next=1) -
^~:前缀匹配,且一旦命中就停止后续正则检查(适合静态资源目录,如
location ^~ /static/) -
~:区分大小写的正则匹配(如
location ~ \.php$) -
~*:不区分大小写的正则匹配(如
location ~* \.(jpg|png|gif)$) -
无修饰符:普通前缀匹配,也是默认行为(如
location /api匹配/api、/api/v1、/api/user/name)
匹配顺序必须记牢
Nginx 不是按配置顺序执行,而是严格按优先级选第一个匹配项:
- 先找 = 精确匹配,命中即停,不看其他规则
- 再找所有前缀匹配(含
^~和无修饰符),挑最长路径前缀的那个 - 如果最长前缀是
^~类型,直接用它,跳过正则 - 如果最长前缀是普通前缀(无修饰符),就继续往下查正则(
~和~*),按配置文件从上到下扫描,第一个正则成功就用它 - 都失败时,兜底用
location /
典型配置示例
一个实用的最小组合:
location = / {
return 200 "Welcome to homepage";
}
<p>location ^~ /static/ {
root /var/www;
}</p><p>location ~ .php$ {
fastcgi_pass 127.0.0.1:9000;
}</p><p>location / {
proxy_pass <a href="https://www.php.cn/link/65b5b8d1f89bf53a5713bc3afdd83e9e">https://www.php.cn/link/65b5b8d1f89bf53a5713bc3afdd83e9e</a>;
}说明:
– 请求 / 走精确匹配;
– 请求 /static/css/app.css 走 ^~ /static/,且不再检查 .php 正则;
– 请求 /index.php 不匹配前缀规则(因为 / 比 /index.php 短,且不是精确或 ^~),进入正则阶段,被 ~ \.php$ 捕获;
– 请求 /user/profile 最终落到 location / 兜底代理。
两个易错点提醒
root 和 alias 别混用:
– root /var/www; + location /img/ → 实际找 /var/www/img/xxx.jpg
– alias /var/www/images/; + location /img/ → 实际找 /var/www/images/xxx.jpg(注意 alias 路径末尾要加 /)
路径结尾斜杠影响匹配:location /api 会匹配 /api、/api/、/apixxx(前缀匹配);
若只想匹配目录,建议写成 location /api/ 或配合 ^~ 控制行为。



















