Nginx location 路径匹配规则深度解析

在 Nginx 配置中,location 指令用于定义如何根据请求的 URI 匹配路径,并指定相应的处理方式。location 块是 Nginx 配置文件(通常是 nginx.conf 或特定站点的配置文件)中非常重要的一部分。以下是 Nginx 中路径匹配 location 规则的详细说明:

图片[1]_Nginx location 路径匹配规则深度解析_知途无界

1. 基本语法

location [modifier] path {
# 配置指令
}
location [modifier] path {
    # 配置指令
}
location [modifier] path { # 配置指令 }
  • modifier:可选的修饰符,用于定义匹配的优先级和类型。
  • path:需要匹配的路径,可以是精确路径、正则表达式或前缀路径。

2. 修饰符(modifier)的类型

Nginx 提供了多种修饰符来控制路径匹配的行为,以下是常用的修饰符及其优先级(从高到低):

修饰符描述
=精确匹配:只有当请求的 URI 完全等于指定的路径时,才会匹配。
^~前缀匹配,优先匹配:如果匹配成功,则停止搜索正则表达式。
~区分大小写的正则表达式匹配:如果请求的 URI 符合正则表达式,则匹配。
~*不区分大小写的正则表达式匹配:与 ~ 类似,但不区分大小写。
无修饰符普通前缀匹配:匹配以指定路径开头的 URI,是默认的匹配方式。

3. 匹配规则和优先级

  • 精确匹配 (=) 优先级最高。如果存在多个 location 块,= 修饰符的路径会优先匹配。
  • 前缀匹配 (^~) 优先于正则表达式匹配。如果 ^~ 匹配成功,则不再检查正则表达式。
  • 正则表达式匹配 (~ 和 ~*) 的优先级低于普通前缀匹配,但会按照配置文件中出现的顺序进行匹配。
  • 普通前缀匹配 是默认的匹配方式,没有修饰符时生效。
  • 如果多个正则表达式匹配成功,则选择第一个匹配的正则表达式。

4. 示例

示例 1:精确匹配

location = /exact {
return 200 'Exact match!';
}
location = /exact {
    return 200 'Exact match!';
}
location = /exact { return 200 'Exact match!'; }
  • 只有当请求的 URI 完全等于 /exact 时,才会匹配。

示例 2:前缀匹配

location /images/ {
root /var/www/html;
}
location /images/ {
    root /var/www/html;
}
location /images/ { root /var/www/html; }
  • 匹配所有以 /images/ 开头的请求,例如 /images/logo.png

示例 3:正则表达式匹配

location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
}
location ~ \.php$ {
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    include fastcgi_params;
}
location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi_params; }
  • 匹配所有以 .php 结尾的请求,例如 /index.php 或 /test.php

示例 4:不区分大小写的正则表达式匹配

location ~* \.(jpg|jpeg|png|gif)$ {
root /var/www/static;
}
location ~* \.(jpg|jpeg|png|gif)$ {
    root /var/www/static;
}
location ~* \.(jpg|jpeg|png|gif)$ { root /var/www/static; }
  • 匹配所有以 .jpg.jpeg.png 或 .gif 结尾的请求,不区分大小写。

示例 5:前缀匹配优先 (^~)

location ^~ /static/ {
root /var/www/static;
}
location ~* \.(css|js)$ {
root /var/www/assets;
}
location ^~ /static/ {
    root /var/www/static;
}
location ~* \.(css|js)$ {
    root /var/www/assets;
}
location ^~ /static/ { root /var/www/static; } location ~* \.(css|js)$ { root /var/www/assets; }
  • 如果请求的 URI 以 /static/ 开头,则优先匹配 ^~ /static/,而不会检查正则表达式。

5. 默认位置

如果没有任何 location 块匹配请求的 URI,Nginx 会返回 404 错误。为了处理未匹配的请求,可以定义一个默认的 location 块:

location / {
root /var/www/html;
index index.html;
}
location / {
    root /var/www/html;
    index index.html;
}
location / { root /var/www/html; index index.html; }
  • 匹配所有未被其他 location 块捕获的请求。

6. 注意事项

  • 正则表达式性能:正则表达式匹配的性能通常低于前缀匹配,因此应尽量减少正则表达式的使用。
  • 匹配顺序:Nginx 会按照优先级和顺序检查 location 块,直到找到匹配的块为止。
  • 路径结尾的斜杠:对于前缀匹配,路径末尾的斜杠可能会影响匹配结果。例如,/images 和 /images/ 是不同的路径。

7. 调试工具

  • 使用 nginx -t 命令测试配置文件的语法是否正确。
  • 使用 curl 或浏览器访问不同的路径,观察 Nginx 的响应行为。
  • 开启 Nginx 的调试日志(error_log 设置为 debug),以便更详细地了解匹配过程。

通过合理使用 location 指令和修饰符,可以灵活地控制 Nginx 的请求路由行为,满足不同的应用需求。

© 版权声明
THE END
喜欢就点个赞,支持一下吧!
点赞22 分享
Sometimes, you have to make your own happy ending.
有时候,只能靠自己书写自己的美好结局
评论 抢沙发
头像
欢迎您留下评论!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容