在 Nginx 中,location 是实现请求路由分发的核心指令,它会根据客户端请求的 URI 匹配对应的配置规则,决定请求的处理方式(静态资源访问、反向代理、访问控制等)。Nginx 提供了精确匹配、前缀匹配、正则匹配等多种模式,匹配遵循固定的优先级与流程
Nginx 的 location 匹配分为两个阶段:先匹配非正则规则(精确 / 前缀),再匹配正则规则;匹配成功后会根据规则类型决定是否终止匹配。
正确优先级顺序(从高到低):
精确匹配(=):优先级最高,完全匹配则立即终止所有匹配
前缀匹配(^~):匹配成功后,不再检查任何正则规则
正则表达式匹配(~ / ~*):按配置文件顺序匹配,匹配即终止
普通前缀匹配(无修饰符):遵循最长前缀优先原则
通用匹配(/):优先级最低,匹配所有未命中的请求
使用 = 修饰符,请求 URI 必须与配置路径完全一致才会匹配,优先级最高,匹配成功后立即生效,不继续匹配其他规则。
# 仅匹配根路径 /
location = / {
root /usr/share/nginx/html;
index index.html;
}
# 仅匹配 /api/login 这一个路径
location = /api/login {
return 200 '登录接口';
}http://domain.com/ → 匹配成功
http://domain.com/api/login → 匹配成功
http://domain.com/api → 匹配失败
用于匹配 URI 前缀,核心作用是屏蔽后续正则匹配,适合静态资源、固定前缀的接口路由,避免正则规则干扰。
# 匹配所有以 /static/ 开头的请求
location ^~ /static/ {
alias /data/static/;
expires 7d;
}匹配成功后,不再执行任何正则匹配
遵循最长前缀优先原则
适合静态资源、无需正则的固定前缀路由
使用 ~(区分大小写)、~*(不区分大小写)修饰符,支持正则语法编写复杂匹配规则,按配置文件的书写顺序匹配,命中即终止。
# 区分大小写:匹配 /api/v1 /api/v2 等路径
location ~ ^/api/v[1-9]/ {
proxy_pass http://backend_api;
}
# 不区分大小写:匹配所有图片、样式、脚本文件
location ~* \.(jpg|jpeg|png|gif|css|js)$ {
root /data/images;
expires 30d;
}/api/v1/user → 匹配第一条规则
/test.PNG → 匹配第二条规则(不区分大小写)
正则规则顺序决定优先级,写在前面的规则优先匹配
最基础的匹配方式,无任何修饰符,仅匹配 URI 前缀,遵循最长前缀优先原则,匹配后不会终止正则检查。
# 匹配所有以 /api 开头的请求
location /api {
proxy_pass http://backend_server;
}
# 匹配所有以 /api/user 开头的请求(更长前缀,优先级更高)
location /api/user {
proxy_pass http://user_server;
}最长前缀优先:/api/user 优先级高于 /api
匹配成功后,仍会继续检查正则规则
适合无特殊需求的通用前缀路由
使用 location /,匹配所有请求,作为兜底规则,处理所有未被其他规则匹配的请求,优先级最低。
# 兜底匹配所有未命中的请求
location / {
root /var/www/default;
index index.html index.htm;
}最长前缀优先
普通前缀匹配、^~ 前缀匹配,都会优先选择路径更长的规则(如 /api/user 优于 /api)。
正则顺序优先
正则匹配不看路径长度,只看配置文件中的书写顺序,先写的规则优先匹配。
^~ 的核心作用
不是优先级最高,而是屏蔽正则匹配,这是静态资源配置的关键。
匹配终止逻辑
=:匹配 → 终止
^~:匹配 → 终止正则
正则:匹配 → 终止
普通前缀:匹配 → 继续检查正则
server {
listen 80;
server_name localhost;
# 1. 精确匹配:根目录
location = / {
root /usr/share/nginx/html;
index index.html;
}
# 2. ^~ 前缀匹配:静态资源,跳过正则
location ^~ /static/ {
alias /data/static/;
expires 7d;
}
# 3. 正则匹配:图片文件
location ~* \.(jpg|png|gif)$ {
root /data/images;
}
# 4. 普通前缀匹配:接口
location /api {
proxy_pass http://backend_api;
}
# 5. 通用匹配:兜底
location / {
return 404 '页面不存在';
}
}