以下是对 Nginx location
匹配模式的详细说明及代码示例,包含注释解析:
1. 精确匹配(Exact Match)
语法: location = /path { ... }
优先级: 最高,仅当请求路径与 /path
完全一致时触发。
location = /login {
# 仅匹配 `/login` 路径(区分大小写)
# 例如:https://example.com/login
proxy_pass http://backend/login;
}
2. 前缀匹配(Prefix Match)
普通前缀匹配
语法: location /prefix { ... }
优先级: 低,按配置文件顺序匹配,但可能被正则匹配覆盖。
location /static/ {
# 匹配以 `/static/` 开头的路径,如 `/static/css/style.css`
# 但如果没有 `^~` 修饰符,可能被后续正则匹配覆盖
root /var/www/html;
}
优先前缀匹配
语法: location ^~ /prefix { ... }
优先级: 中高,匹配以 /prefix
开头的路径,且不再检查后续正则匹配。
location ^~ /images/ {
# 匹配以 `/images/` 开头的路径,如 `/images/logo.png`
# 即使后续有正则匹配 `/images/.*\.png`,此配置仍优先
root /data;
}
3. 正则匹配(Regular Expression Match)
区分大小写的正则
语法: location ~ /regex/ { ... }
优先级: 中,按正则出现的顺序匹配,第一个匹配成功的生效。
location ~ \.php$ {
# 匹配以 `.php` 结尾的路径(区分大小写),如 `/index.php`
# 不会匹配 `/index.PHP`
fastcgi_pass php:9000;
}
不区分大小写的正则
语法: location ~* /regex/ { ... }
优先级: 中,同上,但忽略大小写。
location ~* \.(jpg|png|gif)$ {
# 匹配 `.jpg`, `.png`, `.gif` 结尾的路径,不区分大小写
# 如 `/image.JPG` 或 `/image.jpg`
expires 30d;
}
4. 最长前缀匹配(Longest Prefix Match)
语法: location /longest/possible/path { ... }
优先级: 低,当无精确或正则匹配时,选择最长前缀路径。
location /documents/ {
# 匹配 `/documents/` 开头的路径,如 `/documents/report.pdf`
root /var/data;
}
location /documents/reports/ {
# 更长的前缀,如 `/documents/reports/2023.pdf`
root /var/special-data;
}
优先级总结
优先级从高到低排序:
- 精确匹配 (
location = /path
) - 优先前缀匹配 (
location ^~ /prefix
) - 正则匹配 (
location ~ /regex/
或location ~* /regex/
) - 普通前缀匹配 (
location /path
)
完整示例配置
server {
listen 80;
server_name example.com;
# 1. 精确匹配(最高优先级)
location = /logo.png {
root /var/www/exact;
}
# 2. 优先前缀匹配(次高优先级)
location ^~ /static/ {
root /var/www/static;
}
# 3. 正则匹配(区分大小写)
location ~ /user/\d+ {
proxy_pass http://user_backend;
}
# 4. 正则匹配(不区分大小写)
location ~* \.(js|css)$ {
root /var/www/assets;
}
# 5. 普通前缀匹配(最低优先级)
location / {
root /var/www/default;
}
}
匹配过程解析
- 请求
/logo.png
→ 命中location = /logo.png
(精确匹配)。 - 请求
/static/css/style.css
→ 命中location ^~ /static/
(优先前缀匹配)。 - 请求
/user/123
→ 命中location ~ /user/\d+
(正则匹配)。 - 请求
/IMAGE.JPG
→ 命中location ~* \.(js|css)$
(不区分大小写的正则匹配)。 - 请求
/about
→ 命中location /
(普通前缀匹配)。
调试技巧
- 使用
nginx -T
查看完整配置。 - 通过
error_log logs/error.log debug;
启用调试日志。 - 在线工具测试正则:Nginx Location Tester。
通过理解这些规则,可以更精准地控制 Nginx 的路由逻辑!