Nginx Location 匹配规则

简介: Nginx Location 匹配规则

Nginx 的 location 用于匹配 URI 不同路径的请求,实现对请求的细分处理。例如当客户端请求 https://www.nginx-test.com/index.html 时,Nginx 使用本地的静态文件响应,而当客户端请求相同地址的 https://www.nginx-test.com/api 时,Nginx 将请求转发到后端服务器。

语法

Syntax: location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
Default:  —
Context:  server, location

修饰符

  • = 表示精确匹配。只有请求的url路径与后面的字符串完全相等时,才会命中。使用 = 精确匹配可以加快查找的顺序。
  • ^~ 表示如果该符号后面的字符是最佳匹配(前缀匹配),采用该规则,不再进行后续的查找。
  • 没有修饰符表示前缀匹配。
  • ~ 表示该规则是使用正则定义的,区分大小写。
  • ~* 表示该规则是使用正则定义的,不区分大小写。
  • !~ 表示正则区分大小写不匹配。
  • !~* 表示正则不区分大小写不匹配。

匹配过程

当收到一个url请求时:

  1. Ngixn 首先先检查使用前缀字符定义的 location,选择最长匹配的项并记录下来,然后检查正则表达式定义的 location。这里有两个例外:如果找到了精确匹配的 location,也就是使用了 = 修饰符的location,结束查找,使用它的配置。或者如果通过最长匹配原则匹配到的前缀字符定义的 location 并且是以^~作为修饰符的,结束查找,使用它的配置。
  2. 查找使用正则表达式定义的 location,如果匹配到 location,则立即停止查找,使用它定义的配置。

3.如果没有匹配的正则表达式的 location,则使用前面记录的最长匹配前缀字符的 location。

匹配过程图示image.png

示例

接下来我们以一个例子来说明具体的匹配过程。配置文件:

location = / {
    [ configuration A ]
}
location / {
    [ configuration B ]
}
location /documents/ {
    [ configuration C ]
}
location ^~ /images/ {
    [ configuration D ]
}
location ~* \.(gif|jpg|jpeg)$ {
    [ configuration E ]
}
  • 请求 / 精准匹配A,不再往下查找。
  • 请求 /index.html 匹配 B。首先查找匹配的前缀字符,找到最长匹配是配置 B,接着又按照顺序查找匹配的正则。结果没有找到,因此使用先前标记的最长匹配,即配置 B。
  • 请求 /documents/document.html 匹配 C。首先找到最长匹配 C,由于后面没有匹配的正则,所以使用最长匹配 C。
  • 请求 /images/1.gif匹配 D。首先进行前缀字符的查找,找到最长匹配 D。但是,特殊的是它使用了 ^~ 修饰符,不再进行接下来的正则的匹配查找,因此使用 D。这里,如果没有前面的修饰符,其实最终的通过正则匹配的是 E。
  • 请求 /documents/1.jpg 匹配 E。首先进行前缀字符的查找,找到最长匹配项 C,继续进行正则查找,找到匹配项 E。

location @ 的用法

@ 用来定义一个命名 location。主要用于内部重定向,不能用来处理正常的请求。其用法如下:

location / {
    try_files $uri $uri/ @redirectUri
}
location @redirectUri {
    # ...do something
}

上例中,当尝试访问 url 找不到对应的文件就重定向到我们自定义的命名 location(此处为 @redirectUri)。命名 location 中不能再嵌套其它的命名 location。

location 中的反斜线

location /test {
 ...
}
location /test/ {
 ...
}
  • 不带 / 当访问 ip地址/test 时, Nginx 先找是否有 test 目录,如果有则找 test 目录下的 index.html;如果没有 test 目录, nginx 则会找是否有 test 文件。
  • 带 / 当访问 ip地址/test 时, Nginx 先找是否有 test 目录,如果有则找 test 目录下的 index.html,如果没有它也不会去找是否存在 test 文件。

proxy_pass 的 URL 末尾的反斜线

这里结合 location 和 proxy 对反斜线做进一步说明。proxy_pass 用于配置代理服务器。

语法如下:

Syntax: proxy_pass URL;
Default:  —
Context:  location, if in location, limit_except

URL 参数原则:

  • URL 必须以 http 或 https 开头。
  • URL 中可以携带变量。
  • URL 中是否带 URI ,会直接影响发往上游请求的 URL。

接下来让我们来看看两种常见的 URL 用法:

proxy_pass http://192.168.100.33:8081
proxy_pass http://192.168.100.33:8081/

这两种用法的区别就是带 / 和不带 / ,在配置代理时它们的区别可大了:

  • 不带 / 意味着 Nginx 不会修改用户 URL ,而是直接透传给上游的应用服务器。
  • 带 / 意味着 Nginx 会修改用户 URL ,修改方法是将 location 后的 URL 从用户 URL 中删除。

不带 / 的用法:

location /bbs/{
  proxy_pass http://127.0.0.1:8080;
}

分析:

  • 用户请求 URL:/bbs/abc/test.html。
  • 请求到达 Nginx 的 URL:/bbs/abc/test.html。
  • 请求到达上游应用服务器的 URL:/bbs/abc/test.html。

带 / 的用法:

location /bbs/{
  proxy_pass http://127.0.0.1:8080/;
}

分析:

  • 用户请求 URL:/bbs/abc/test.html。
  • 请求到达 Nginx 的 URL:/bbs/abc/test.html。
  • 请求到达上游应用服务器的 URL:/abc/test.html。

参考链接

目录
相关文章
|
5月前
|
自然语言处理 前端开发 应用服务中间件
nginx的Location语法规则
nginx的Location语法规则
|
6月前
|
应用服务中间件 nginx
Nginx系列教程(07) - Location正则表达式
Nginx系列教程(07) - Location正则表达式
70 0
|
2天前
|
应用服务中间件 网络安全 nginx
nginx(1.13.7)首次安装出现:【make: *** 没有规则可以创建“default”需要的目标“build” 问题】解决措施
nginx(1.13.7)首次安装出现:【make: *** 没有规则可以创建“default”需要的目标“build” 问题】解决措施
|
1月前
|
Kubernetes 应用服务中间件 网络安全
kubernetes中Ingress Nginx 常用规则使用
kubernetes中Ingress Nginx 常用规则使用
15 0
|
7月前
|
应用服务中间件 nginx 数据安全/隐私保护
安装Nginx报错:make: *** 没有规则可以创建“default”需要的目标“build”。 停止。
安装Nginx报错:make: *** 没有规则可以创建“default”需要的目标“build”。 停止。
192 0
|
4月前
|
数据采集 应用服务中间件 nginx
百度搜索:蓝易云【nginx一些常用user_agent的匹配规则】
这个规则将会根据user_agent中是否包含"Android"、"iPhone"或"iPad"等关键词,将根目录的访问重定向到/mobile/目录下。需要注意的是,使用if指令可能会导致性能下降,建议尽量使用map模块进行user_agent的匹配。在编写规则时,应该确保匹配规则的准确性,以免误判或产生意外的结果。
61 0
|
6月前
|
应用服务中间件 程序员 Shell
后端程序员不得不会的 Nginx 转发匹配规则
后端程序员不得不会的 Nginx 转发匹配规则
|
7月前
|
应用服务中间件 nginx
【Nginx】记录 nginx 配置文件中 location下根据 ua (user-agent) 判断移动端和电脑端不同浏览器来源
【Nginx】记录 nginx 配置文件中 location下根据 ua (user-agent) 判断移动端和电脑端不同浏览器来源
100 0
|
7月前
|
运维 Java 应用服务中间件
【Nginx用法】nginx location正则表达式写法,详解Nginx location 匹配规则(很详细哦)
【Nginx用法】nginx location正则表达式写法,详解Nginx location 匹配规则(很详细哦)
87 0
|
9月前
|
运维 应用服务中间件 nginx
【运维知识进阶篇】Nginx Location语法优先级详解
【运维知识进阶篇】Nginx Location语法优先级详解
83 0