Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >实用篇-无处不在的Location

实用篇-无处不在的Location

作者头像
后端技术探索
发布于 2018-08-10 02:29:50
发布于 2018-08-10 02:29:50
52700
代码可运行
举报
文章被收录于专栏:后端技术探索后端技术探索
运行总次数:0
代码可运行

location配置是nginx模块化配置中最出色的一个设计,几乎所有nginx的业务场景都要通过书写多个location配置来顺应业务需要。语法配置和执行规则都相对比较简单,完全可以掌握在脑海之中。

1、配置规则

只要在网上搜一下,或者去官网翻一下文档,都能知道有几种规则,这是官网的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Syntax:    location [ = | ~ | ~* | ^~ ] uri { ... }location @name { ... }
Default:Context:    server, location

总而言之,包含两部分内容,一部分是匹配前提条件或者叫要求,另外一部分是要匹配的东西,也就是匹配内容。

下面这段是官网说明的谷歌翻译:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
在对“%XX”形式编码的文本进行解码之后,针对归一化的URI执行匹配,解析对相对路径组件“.”和“..”的引用,以及将两个或多个相邻斜杠可能压缩为单个斜杠。

localtion可以由前缀字符串或正则表达式定义。正则表达式使用前面的“〜*”修饰符(不区分大小写匹配)或“〜”修饰符(用于区分大小写匹配)指定。要找到匹配给定请求的位置,nginx首先检查使用前缀字符串(前缀位置)定义的位置。其中,选择并记住具有最长匹配前缀的位置。然后检查正则表达式,按照它们在配置文件中的显示顺序。正则表达式的搜索在第一个匹配中终止,并且使用相应的配置。如果没有找到与正则表达式匹配,则使用之前记住的前缀位置的配置。

localtion blocks可以嵌套,下面提到一些例外。

对于不区分大小写的操作系统,如macOS和Cygwin,与前缀字符串的匹配忽略了一个情况(0.7.7)。但是,比较仅限于一个字节的区域设置。

正则表达式可以包含稍后可以在其他指令中使用的捕获(0.7.40)。

如果最长匹配的前缀位置具有“^〜”修饰符,则不会检查正则表达式。

另外,使用“=”修饰符可以定义一个完全匹配的URI和位置。如果找到完全匹配,则搜索终止。例如,如果频繁出现“/”请求,则定义“location = /”将加快对这些请求的处理,因为搜索在第一次比较之后立即终止。这样的位置不能明显地包含嵌套的位置。

在从0.7.10.8.41的版本中,如果请求匹配前缀位置而没有“=”和“^〜”修饰符,则搜索也将被终止,而正则表达式未被检查

根据上面的说明可知,默认情况, nginx先检查前缀字符串,然后检查正则表达式,如果前缀字符串匹配到了,并且前缀字符串有这个“^~” 要求,就不配正则了;如果没有这个“^~” ,即使前缀匹配到了,也要去匹配正则表则,如果正则表达式匹配到了,就是用正则表达式的,没有就是用前缀字符串匹配到的路径;

2、无正则表达式匹配

规则:使用匹配到的最长的前缀的路径。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        location  / {
            root   html;
            index  index.html index.htm;
        }        
        location  /img {
            root   D:/nginx/img;
            index  test.png;
        }

这是nginx下载安装完成后,增加了一个叫img的配置,访问路径是http://localhost/img,访问一下看看什么效果,我开启了日志,就不截图了,直接看日志里,nginx查找的路径:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
D:/nginx/img/img/test.png" is not found (3: The system cannot find the path specified)

文件查找的路径是D:/nginx/img(这是我配置的路径),下面的img文件下的test.png文件

如果改成这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 location  / {
            root   html;
            index  index.html index.htm;
        }        
        location  /img/ {
            root   D:/nginx/img;
            index  test.png;
        }

看看有没有区别,重新启动,在访问http://localhost/img试一下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"D:/nginx/img/img/test.png" is not found (3: The system cannot find the path specified)

和之前没什么区别,也就是两个效果是一样的,在浏览其中http://localhost/img和http://localhost/img/是一样的。

再改一下,重启:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
     location  / {
                root   html;
                index  index.html index.htm;
            }            
            location  /img/ {
                root   D:/nginx/img/;
                index  test.png;
            }

我在重新访问一下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"D:/nginx/img/img/test.png" is not found (3: The system cannot find the path specified)

还是一样的效果。 所以如果是前缀字符串匹配,就不要纠结后面要不要加“/”的问题。 另外从结果上看,确实符合规则,使用前缀最长的匹配路径。

2、有正则匹配,无符号修饰

规则:无“^~”, 最终使用正则匹配到的路径,正则匹配不到,使用字符串前缀匹配最长的

增加一个配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    location  \/img\/ {
                root   D:/nginx/reg/;
                index  test.png;
            }

重启访问:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"D:/nginx/img/img/test.png" is not found (3: The system cannot find the path specified)

结果发现,找的还是D:/nginx/img的img文件夹的文件,好像正则没有匹配上,改一下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    location  \/img {
                root   D:/nginx/reg/;
                index  test.png;
            }

这下一定可以匹配上了,重启http://localhost/img测试:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"D:/nginx/img/img/test.png" is not found (3: The system cannot find the path specified)

无语了,为什么没有按照规则来呢,为什么没有查找D:/nginx/reg/路径下的文件呢?

回到前面看一下官网说明,发现正则表达式需要"~"或者"~*"指定才行,修改为下面的配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    location ~* \/img\/ {                root   D:/nginx/reg/;                index  test.png;
            }

重启访问http://localhost/img测试:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"D:/nginx/reg/img/test.png"

这下按照规则了,看东西看来还是要认真看啊!

改一下正则表达式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        location ~* \/img {                root   D:/nginx/reg/;                index  test.png;
            }

再重启测试:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"D:/nginx/reg/img/test.png" is not found (3: The system cannot find the path specified)

也可以正常匹配,也就是说正则匹配的情况下,最后一个/要不要都行,效果是一样的

另外“~*” 不区分大小写和“~”就不用试,应该都知道

3、精确匹配=号

规则:精确匹配某个路径,优先级最高

增加一种配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    location = /img/test.png {
                root   D:/nginx/denghao/;
                index  test.png;
            }

重启访问路径http://localhost/img/test.png:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"D:/nginx/denghao/img/test.png" failed (3: The system cannot find the path specified)

从结果看出,和规则一致;

改一下配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    location = /img/ {
                    root   D:/nginx/wuhouzhui/;
                    index  test.png;
                }

测试结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"D:/nginx/reg/img/test.png" is not found (3: The system cannot find the path specified)

从结果上看,最终使用的匹配路径是正则,至于 = /img/,有没有匹配到,我也不清楚,总而言之,这种情况下使用的是正则的路径,有知道朋友解释一下=号有没有匹配到。

4、提高前缀字符串的优先级的“^~”

规则:如果最长匹配的前缀位置具有“^〜”修饰符,则不会检查正则表达式

因为先搜索匹配的是前缀字符串,所有匹配到了,有这个修饰符就不检查正则了,所以正则就不考虑了。 把配置改一下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
            location ^~ /img/ {                root   D:/nginx/img/;                index  test.png;
            }            
            location = /img/test.png {                root   D:/nginx/denghao/;                index  test.png;
            }

访问http://localhost/img/test.png测试:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"D:/nginx/denghao/img/test.png" failed (3: The system cannot find the path specified)

可以看到匹配结果是等号的路径,所以=号的优先级比^~高

5、总结

搜索优先级:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
精确匹配 > 字符串匹配(>[: ^~ 匹配则停止匹配 ]) > 正则匹配(>)

使用优先级:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
精确匹配 >^~) > 正则匹配(>)>字符串(长 > 端)
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-04-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 nginx 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
nginx之location指令
localtion可以由前缀字符串或正则表达式定义。正则表达式使用前面的“〜*”修饰符(不区分大小写匹配)或“〜”修饰符(用于区分大小写匹配)指定。要找到匹配给定请求的位置,nginx首先检查使用前缀字符串(前缀位置)定义的位置。默认情况, nginx先检查前缀字符串,然后检查正则表达式,如果前缀字符串匹配到了,并且前缀字符串有这个“^~” 要求,就不配正则了;如果没有这个“^~” ,即使前缀匹配到了,也要去匹配正则表则,如果正则表达式匹配到了,就是用正则表达式的,没有就是用前缀字符串匹配到的路径
山行AI
2019/08/05
1.5K0
Nginx Location 匹配规则
Nginx 的 location 用于匹配 URI 不同路径的请求,实现对请求的细分处理。例如当客户端请求 https://www.nginx-test.com/index.html 时,Nginx 使用本地的静态文件响应,而当客户端请求相同地址的 https://www.nginx-test.com/api 时,Nginx 将请求转发到后端服务器。
Se7en258
2021/07/01
1.5K0
Nginx - location中的匹配规则和动态Proxy
https://nginx.org/en/docs/http/ngx_http_core_module.html#location
小小工匠
2024/05/26
1.4K0
Nginx - location中的匹配规则和动态Proxy
Nginx的location配置规则梳理
Nginx几乎是当下绝大多数公司在用的web应用服务,熟悉Nginx的配置,对于我们日常的运维工作是至关重要的,下面就Nginx的location配置进行梳理: 1)location匹配的是nginx
洗尽了浮华
2018/01/23
2.1K0
附001.Nginx location语法规则
对请求的url序列化。例如,对%xx等字符进行解码,去除url中多个相连的/,解析url中的.,..等。这一步是匹配的前置工作。
木二
2020/07/22
3.1K0
Location规则介绍
location修饰符类型 「=」 修饰符:要求路径完全匹配 server { server_name website.com; location = /abcd { […]
OwenZhang
2021/12/08
7090
Nginx的location规则迷之匹配
Nginx,一个改变世界的软件,其作者是一个俄罗斯人,俗称毛子,在国人的印象中,是一群晚饭后牵着大灰熊在小区楼下散步的彪汉。能写出这般顺滑的软件,可谓是心有猛虎细嗅蔷薇典型代表啊。 很多同学都被location规则绕得云里雾里,总是搞不清楚自己写的规则为什么没有生效。其实location复杂的匹配规则可以用一句话来概括——女生想用最省力的方法找合适的男生。好像更云里雾里了,且听我娓娓道来。
小俊是我
2018/10/10
3.4K0
nginx的location、rewrite玩法详解
顺序 no优先级: (location =) > (location 完整路径) > (location ^~ 路径) > (location ~,~* 正则顺序) > (location 部分起始路径) > (/)
sunsky
2020/08/20
1.2K0
决定努力学Nginx/OpenResty详解,location路由规则配置详解了
location路由匹配发生在HTTP请求处理的find-config配置查找阶段,主要功能是:根据请求的URI地址匹配location路由表达式,如果匹配成功,就执行location后面的上下文配置块。
愿天堂没有BUG
2022/10/28
1.2K0
决定努力学Nginx/OpenResty详解,location路由规则配置详解了
nginx location 配置详解
指令作用 匹配指定的请求uri(请求uri不包含查询字符串,如http://localhost:8080/test?id=10,请求uri是/test) 语法形式 location [ = | ~
西湖醋鱼
2020/12/30
1.7K0
Nginx配置location总结及rewrite规则写法
location = / {     # 精确匹配 /,主机名后面不能带任何字符串     [ configuration A ]  } location / {     # 因为所有的地址都以/开头,所有这条规则将匹配到所有请求     # 但是正则和最长字符串会优先匹配     [ configuration B ] } location /documents/ {     # 匹配任何以/documents/开头的地址,匹配符合以后,还要继续往下搜索     # 只有后面的正则表达式没有匹配到时,这一条才会采用     [ configuration C ] } location ~ /documents/Abc {     # 匹配任何以 /documents/开头的地址,匹配符合以后,还要继续往下搜索     # 只有后面的正则表达式没有匹配到时,才会采用这一条      [ configuration CC ] } location ^~ /images/ {     # 匹配任何以/images/开头的地址,匹配符合以后,停止往下搜索正则,采用这一条     [ configuration D ] } location ~* \.(gif|jpg|jpeg)$ {     # 匹配所有以gif,jpg或jpeg结尾的请求     # 然而,苏朋友请求/images/下的图片会被config D处理,因为^~到达不了这一正则     [ configuration E ] } location /images/ {     # 字符匹配到 /images/,继续往下,会发现^~存在     [ configuration F ] } location /images/abc {     # 最长字符匹配到/images/abc,继续往下,会发现^~存在     # F与G的放置顺序是没有关系的     [ configuration G ] } location ~ /images/abc/ {     # 只有去掉config D才有效:先最长匹配config G开头的地址,继续往下搜索,匹配到这一正则,采用     [ configuration H ] } location ~* /js/.*/\.js
星哥玩云
2022/07/29
1.1K0
Nginx中location、rewrite使用方法
矫正: location 的匹配顺序其实是“先匹配普通,再匹配正则”。我这么说,大家一定会反驳我,因为按“先匹配普通,再匹配正则”解释不了大家平时习惯的按“先匹配正则,再匹配普通”的实践经验。这里我只能暂时解释下,造成这种误解的原因是:正则匹配会覆盖普通匹配。
星哥玩云
2022/07/28
1.2K0
Nginx中location、rewrite使用方法
[日常] nginx与location规则
========================================================================= 2018年3月28日 记录:
唯一Chat
2019/09/10
8290
Nginx正确配置Location
之前已经讲过Nginx的基本配置,本篇文章主要对Nginx中Location指令的作用进行介绍。本篇文章主要对Nginx的Location配置原则进行详细的讲述。Location是根据用户请求的URI来进行不同的定位,定位到不同的处理方式上,匹配成功即进行相关的操作。首先需要先介绍一下Nginx的echo模块,它可以配置的Location标签是否正确,是否达到配置的目的。
创译科技
2019/08/30
1.2K0
Nginx正确配置Location
【Nginx06】Nginx学习:HTTP核心模块(三)Location
Location 是整个 HTTP 模块中非常重要的一个子模块,它是为某个请求URI(路径)建立配置。这个模块又是属于 Server 模块的子模块,同时它还可以嵌套在另一个 Location 模块下面,因此,它的作用范围是 server 和 location 。其实,说白了,也就是我们可以为指定的一些路径去做一些额外的配置。
硬核项目经理
2023/08/09
1K0
【Nginx06】Nginx学习:HTTP核心模块(三)Location
nginx location if 的匹配规则
~      #波浪线表示执行一个正则匹配,区分大小写 ~*    #表示执行一个正则匹配,不区分大小写 ^~    #^~表示普通字符匹配,不是正则匹配。如果该选项匹配,只匹配该选项,不匹配别的选项,一般用来匹配目录 =      #进行普通字符精确匹配 @     #"@" 定义一个命名的 location,使用在内部定向时,例如 error_page, try_files
拓荒者
2019/03/11
13K0
nginx配置 location及rewrite规则详解
1. location正则写法 语法规则: location [=|~|~*|^~] /uri/ { … } =    开头表示精确匹配 ^~  开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)。 ~   开头表示区分大小写的正则匹配 ~*  开头表示不区分大小写的正则匹配 !~和!~*分别为区分大小写不匹配及不区分大小写不匹配 的正则 / 通用匹配,任何请求都会匹
用户1214487
2018/05/28
2.9K0
Nginx http相关常用配置总结
设置允许的客户端请求体大小最大值,请求头域Content-Length指明的值。如果请求体大小超过配置设置值,返回413错误给客户端。需要注意的是,浏览器不定义可以正确的展示该错误。设置client_max_body_size 为0,禁用请求体大小检查。
授客
2019/09/11
1.5K0
Nginx系列教程(6)Nginx location 匹配规则详细解说
Nginx 的 location 实现了对请求的细分处理,有些 URI 返回静态内容,有些分发到后端服务器等,今天来彻底弄懂它的匹配规则
haikangweishi
2020/04/04
1.7K0
Nginx server_name和location匹配规则
⑥如果所有Host头匹配失败,那么将会转向listen指令标记的default server;
用户4046016
2021/04/19
8.1K0
相关推荐
nginx之location指令
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验