Nginx中`location`路径匹配规则
以下是Nginx中location
路径匹配规则的详细解析及使用指南,综合官方文档与最佳实践:
一、匹配规则分类与优先级
Nginx的location
匹配分为五类,优先级从高到低如下:
-
精确匹配(
=
)- 语法:
location = /path { ... }
- 规则:仅当请求路径与
/path
完全一致时生效,区分大小写。 - 示例:
location = /login {proxy_pass http://backend; # 仅匹配/login,不匹配/login/或/login.html }
- 优先级最高,匹配成功后立即终止搜索。
- 语法:
-
强制前缀匹配(
^~
)- 语法:
location ^~ /prefix { ... }
- 规则:匹配以
/prefix
开头的路径,且停止后续正则匹配。^~
意味着“如果匹配此前缀,则不再继续匹配正则”。这可以提升性能并确保特定目录下的资源不会被意外的正则规则处理 - 示例:
location ^~ /static/ {alias /data/static/; # 匹配/static/a.html,但不检查后续正则规则 }
- 优先级高于正则匹配,适用于高频静态资源路径。
- 语法:
-
正则匹配(
~
或~*
)- 区分大小写(
~
):location ~ \.php$ {fastcgi_pass php:9000; # 匹配/index.php,不匹配/index.PHP }
- 不区分大小写(
~*
):location ~* \.(jpg|png)$ {expires 30d; # 匹配/logo.JPG和/icon.png }
- 按配置文件中的顺序匹配,第一条匹配的正则生效。
- 区分大小写(
-
普通前缀匹配(无修饰符)
- 语法:
location /path { ... }
- 规则:按最长匹配原则选择路径前缀。
- 示例:
location /blog/ {root /var/www/html; # 匹配/blog/post.html,但优先级低于^~ }
- 若多个普通前缀匹配,选择定义顺序靠前的。
- 语法:
-
通用匹配(
/
)- 语法:
location / { ... }
- 规则:匹配所有未被其他规则匹配的请求,作为兜底规则。
- 语法:
二、关键注意事项
-
优先级冲突处理
- 若请求同时匹配
^~
和正则规则,^~
优先(如/images/logo.png
匹配^~ /images/
而非~* \.png$
)。 - 正则匹配按配置文件顺序执行,建议将高频规则前置。
- 若请求同时匹配
-
路径结尾斜杠(
/
)location /dir
会匹配/dir
和/dir/
,若需严格区分,应显式配置:location /dir/ { ... } # 仅匹配以/dir/开头的路径
-
性能优化
- 精确匹配和
^~
前缀匹配性能优于正则,高频路径建议优先使用。 - 避免使用
.*
开头的低效正则表达式。
- 精确匹配和
-
root
与alias
区别root
拼接完整路径:location /static/ {root /data; # 文件路径为/data/static/a.jpg }
alias
直接替换路径:location /static/ {alias /data/; # 文件路径为/data/a.jpg }
三、实战配置示例
server {listen 80;server_name example.com;# 1. 精确匹配(最高优先级)location = /favicon.ico {access_log off;root /var/www/icons;}# 2. 强制前缀匹配(API路由)location ^~ /api/v1/ {proxy_pass http://backend-v1;}# 3. 正则匹配(图片缓存)location ~* \.(jpg|png|css)$ {expires 7d;root /var/www/assets;}# 4. 普通前缀匹配(博客)location /blog/ {root /var/www/html;index index.html;}# 5. 通用匹配(兜底)location / {try_files $uri $uri/ /index.html;}
}
说明:
- 请求
/api/v1/user
匹配^~ /api/v1/
而非正则规则。 - 请求
/logo.PNG
因~*
不区分大小写匹配缓存规则。
四、调试与验证
- 测试配置语法:
nginx -t
- 查看匹配结果:
location /test {add_header X-Matched $uri;return 200 "Matched: $uri"; }
- 日志分析:
error_log /var/log/nginx/error.log debug; # 启用调试日志
通过合理组合这些规则,可实现高效、灵活的路由控制。复杂场景建议通过curl -v
和日志逐步验证匹配逻辑。