资讯专栏INFORMATION COLUMN

nginx location配置规则学习

CoffeX / 1769人阅读

摘要:然后检查正则表达式,按照它们在配置文件中的显示顺序。正则表达式的搜索在第一个匹配中终止,并且使用相应的配置。正则表达式可以包含稍后可以在其他指令中使用的捕获。

最近学习vuejs,做前后端分离,demo做完了,最终还是要发布的,于是学习nginx,其它配置倒是还好理解,唯独对localtion理解不了,最后请教了一些网友,才得以解决问题,但是不希望下次还遇到问题,所以这里把localtion的配置规则,都尝试一遍,也记录一下,方便自己,也方便别人。

1、配置规则

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

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

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

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

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

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

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

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

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

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

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

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

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

2、无正则表达式匹配

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

        location  / {
            root   html;
            index  index.html index.htm;
        }
        
        location  /img {
            root   D:/nginx/img;
            index  test.png;
        }

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

D:/nginx/img/img/test.png" is not found (3: The system cannot find the path specified)

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

如果改成这样:

 location  / {
            root   html;
            index  index.html index.htm;
        }
        
        location  /img/ {
            root   D:/nginx/img;
            index  test.png;
        }

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

"D:/nginx/img/img/test.png" is not found (3: The system cannot find the path specified)

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

再改一下,重启:

     location  / {
                root   html;
                index  index.html index.htm;
            }
            
            location  /img/ {
                root   D:/nginx/img/;
                index  test.png;
            }

我在重新访问一下:

"D:/nginx/img/img/test.png" is not found (3: The system cannot find the path specified)

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

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

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

增加一个配置:

    location  /img/ {
                root   D:/nginx/reg/;
                index  test.png;
            }

重启访问:

"D:/nginx/img/img/test.png" is not found (3: The system cannot find the path specified)

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

    location  /img {
                root   D:/nginx/reg/;
                index  test.png;
            }

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

"D:/nginx/img/img/test.png" is not found (3: The system cannot find the path specified)

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

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

    location ~* /img/ {
                root   D:/nginx/reg/;
                index  test.png;
            }

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

"D:/nginx/reg/img/test.png"

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

改一下正则表达式:

        location ~* /img {
                root   D:/nginx/reg/;
                index  test.png;
            }

再重启测试:

"D:/nginx/reg/img/test.png" is not found (3: The system cannot find the path specified)

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

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

3、精确匹配=号

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

增加一种配置:

    location = /img/test.png {
                root   D:/nginx/denghao/;
                index  test.png;
            }

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

"D:/nginx/denghao/img/test.png" failed (3: The system cannot find the path specified)

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

改一下配置:

    location = /img/ {
                    root   D:/nginx/wuhouzhui/;
                    index  test.png;
                }

测试结果:

"D:/nginx/reg/img/test.png" is not found (3: The system cannot find the path specified)

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

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

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

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

            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测试:

"D:/nginx/denghao/img/test.png" failed (3: The system cannot find the path specified)

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

5、总结

搜索优先级:

精确匹配 > 字符串匹配( 长 > 短 [ 注: ^~ 匹配则停止匹配 ]) > 正则匹配( 上 > 下 )

使用优先级:

精确匹配 > (^~) > 正则匹配( 上 > 下 )>字符串(长 > 端)

刚学的,如果有错误,请指出,我修改,别让错误误导他人。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/39535.html

相关文章

  • Nginx 学习总结(3)—— Location 模块

    摘要:改为后,显示出文件的大概大小,单位是或者或者默认为,显示的文件时间为时间。 这是 Nginx 学习总结的第三篇,上一篇介绍到了 Nginx 学习总结(2) —— 基本配置,这一篇会对Location 模块 做一些总结。我们知道,Location 模块 主要是用于针对某些特定的 URL 进行配置,可以由前缀字符串定义,也可以由正则表达式定义。 Location 匹配规则 location...

    biaoxiaoduan 评论0 收藏0
  • Nginx-深度学习

    摘要:深度学习篇一动静分离通过中间件将动态请求和静态请求进行分离。原因分离资源,减少不必要的请求消耗,减少请求延时。关闭后,重定向会失效。验证规则保持一致。启动,也会要求你输入密码。根据用户的信息等信息区别根据用户的地址实现灰度发布示意图 Nginx-深度学习篇 一、动静分离 通过中间件将动态请求和静态请求进行分离。原因:分离资源,减少不必要的请求消耗,减少请求延时。 动态和静态请求图例:s...

    wh469012917 评论0 收藏0
  • Nginx-深度学习

    摘要:深度学习篇一动静分离通过中间件将动态请求和静态请求进行分离。原因分离资源,减少不必要的请求消耗,减少请求延时。关闭后,重定向会失效。验证规则保持一致。启动,也会要求你输入密码。根据用户的信息等信息区别根据用户的地址实现灰度发布示意图 Nginx-深度学习篇 一、动静分离 通过中间件将动态请求和静态请求进行分离。原因:分离资源,减少不必要的请求消耗,减少请求延时。 动态和静态请求图例:s...

    Carson 评论0 收藏0
  • 在开发环境下使用nginx重写uri及代理功能

    摘要:本文同步在个人博客上,欢迎关注这篇文章整理了在前端开发中,在开发环境下使用重写及代理功能的方法。表示该规则是使用正则定义的,区分大小写。因此牢记在上下文中使用,而在上下文中使用。 本文同步在个人博客shymean.com上,欢迎关注 这篇文章整理了在前端开发中,在开发环境下使用nginx重写uri及代理功能的方法。 参考 nginx中文文档 前端开发者必备的 Nginx 知识 Ngin...

    LMou 评论0 收藏0
  • Nginx location匹配规则

    摘要:以下列配置为例语法规则开头表示精确匹配开头表示以某个常规字符串开头,理解为匹配路径即可表示区分大小写的正则匹配表示不区分大小写的正则匹配和分别为区分大小写不匹配及不区分大小写不匹配的正则通用匹配,任何请求都会匹配到。 以下列配置为例 server { listen 80; server_name jouypub.com; location ^~ ...

    Carson 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<