🎯 Location 匹配规则
匹配优先级(重要!)
当一个 URL 请求来了,Nginx 会按优先级查找匹配的 location。就像在图书馆找书——先精确查找书号,再按分类找,最后看推荐区。
| 语法 | 含义 | 优先级 | 示例 |
|---|---|---|---|
| = | 精确匹配 | 🥇 最高 | = /api/v1/users |
| ^~ | 前缀匹配(匹配后不再查正则) | 🥈 次高 | ^~ /static/ |
| ~ | 正则匹配(区分大小写) | 🥉 普通 | ~ .php$ |
| ~* | 正则匹配(不区分大小写) | 🥉 普通 | ~* .(jpg|png|gif)$ |
| 无修饰 | 前缀匹配 | 最低 | /api/ |
实战演示
nginx
server {
listen 80;
server_name example.com;
# 精确匹配首页
location = / {
return 200 "这是首页"; # 🥇 优先级最高
}
# 精确匹配 favicon
location = /favicon.ico {
access_log off;
return 204;
}
# 前缀匹配静态文件(^~ 匹配后不查正则)
location ^~ /static/ {
root /var/www; # 🥈 优先级次高
}
# 正则匹配图片文件(不区分大小写)
location ~* \.(jpg|jpeg|png|gif|ico|webp)$ {
root /var/www/images; # 🥉 正则匹配
expires 30d;
}
# 正则匹配 PHP 文件
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# 默认匹配(优先级最低)
location / {
try_files $uri $uri/ /index.html;
}
}匹配流程图解
一个请求来到 Nginx,匹配过程是这样的:
- 先检查所有=精确匹配,命中就直接用
- 再检查所有^~前缀匹配,命中就直接用
- 然后按顺序检查~和~*正则匹配,第一个命中就用
- 最后用最长前缀匹配的无修饰 location
💡 提示: 💡 调试技巧:如果不确定哪个 location 被匹配了,在每个 location 里加一个独特的响应头,然后用curl -I http://example.com/path查看。