nginx 配置location匹配规则实例讲解

nginx 配置location匹配规则实例讲解,第1张

nginx配置location匹配规则实例讲解

在本文内容中,我为大家整理了nginx配置位置匹配标准的案例解读,有需要的朋友要学习和培训。

nginx的配置命令的范围可以分为三种:main、server和location。其实这三种类型并不是先后相关的,而是独立分布的。比如一个只有main级别作用域的命令不能写在某个服务器或者位置,控制模块的一个命令可以有其他main,server,location。此外,每个控制模块有三个配置级别:主、srv和loc。控制模块的主级配置与所有服务器和位置共享资源,而srv级配置与所有位置共享资源。位置只有它自己单独的loc级配置,这就是为什么一个控制模块的SRV和LOC级配置必须合并,而主级配置不需要合并。这里好像有点绕。把main、server、location区分为一个作用域级别和一个行为主体,就不难理解nginx的配置关联了,类似于修饰符和名字的区别。

一般来说,一个请求url回来,nginx会分析到某个位置来解决。其实这个分析的整个过程按照位置的配置基础可以分为字符串匹配和正则表达式匹配。至于位置的组织方法,直接把它们存储成链表就很简单了。分析URL时,可以通过逐个解析xml找到相对位置。但是这样的高效率太低了,对于nginx这样性能优异的网络服务器来说完全不可取。nginx把带字符串匹配的位置组织变成了三叉的字符串排序树,树的稳定性也是在创建的时候考虑到的。我将在文章的后面详细解释源代码的完成。

首先我简单介绍一下位置的类型和匹配标准,以NginxWiki(http://wiki.nginx.org/httpcoremodule#位置)为例:

位置优先官网文本文件

  • 前缀为=的指令与查询完全匹配。如果找到,搜索停止。
  • 所有剩余的带有传统字符串的指令,首先是最长的匹配。如果匹配使用了^~前缀,搜索将停止。
  • 正则表达式,按照配置文件中的定义顺序。
  • 如果#3产生了一个匹配,则使用该结果。否则使用来自#2的匹配。
  • =Prefix命令严格匹配此视图。如果正在搜索,则终止搜索。

    所有剩下的基本字符串数组,最多匹配。如果将前缀应用于此匹配项,搜索将终止。

    正则表达式,配置文件中定义的顺序。

    如果第三个条件匹配,则应用该结果。否则,似乎应用了第二个标准。

    例如

    location=/{ #只匹配"/". [configurationA] } location/{ #匹配一切请求,由于全部请求全是以"/"刚开始 #可是更长标识符匹配或是正则表达式匹配会优先选择匹配 [configurationB] } location^~/images/{ #匹配一切以/images/刚开始的请求,并终止匹配其他location [configurationC] } location~*\.(gif|jpg|jpeg)${ #匹配以gif,jpg,orjpeg末尾的请求. #可是全部/images/文件目录的请求将由[ConfigurationC]解决. [configurationD] }

    可以看到,在上面的例子中有五种不同的位置,第四种带有前缀“~”的位置是正则表达式必须匹配的位置。nginx在url解析中对这五种不同的位置有不同的优先级标准。大致标准如下:

    1.如果字符串数组精确匹配前缀为“=”的位置,它将被终止,并将应用此位置的配置;

    2.该字符串匹配剩余的不规则表达式和非唯一位置。如果它匹配带有“~”前缀的位置,它将被终止。

    3.正则表达式匹配,匹配顺序是位置在配置文档中出现的顺序。如果匹配了正则表达式位置,则终止该位置,并应用该位置的配置;否则,应用在过程2中获得的具有较大字符串匹配的位置配置。

    例如,以下请求是:

    1,/->;准确匹配到第一个位置,停止匹配,应用配置a。

    2、/some/other/URL->;首先,前缀字符串的一部分匹配到第二个位置,然后进行正则表达式匹配。如果显然没有匹配,则应用第二个位置的配置b。

    3、/images/1.jpg->;首先,前缀字符串的一部分匹配第二个位置,但是第三个位置也是前缀匹配的。此时配置文档中该url的较大字符串已经匹配,位置包含“~”前缀,因此不进行正则表达式匹配。最后,应用配置C。

    4、/some/other/path/to/1.jpg->;首先前缀部分匹配相同的字符串到第二个位置,然后进行正则表达式匹配。此时,如果正则表达式匹配成功,则应用配置D。

    请求URI实例:

    /->合乎configurationA /documents/document.html->合乎configurationB /images/1.gif->合乎configurationC /documents/1.jpg->合乎configurationD @location事例 error_page404=@fetch; location@fetch( proxy_passhttp://fetch; )

    位置匹配指令

  • ~#波浪线表示实现了正则表达式匹配来区分英文大小写。
  • ~*#表示实现了正则表达式匹配,不考虑英文大小写。
  • ~#~表示通用标识符匹配。如果该选项匹配,则只匹配该选项,不匹配其他选项。它通常用于匹配文件目录。
  • =#对通用标识符进行精确匹配
  • @#"@"定义一个命名位置并将其应用于内部项目,如error_page和try_files。
  • 匹配位置的优先级(与配置文件中位置的顺序无关)

    =将首先解决精确匹配。如果找到完全匹配,nginx将停止搜索其他匹配。

    通用标识符匹配、正则表达式标准和长块标准将优先选择和检查匹配。换句话说,如果进行了这个匹配,就需要检查是否有正则表达式匹配和更长的匹配。

    ~只匹配这个标准,nginx停止搜索其他匹配,否则nginx会再次求解其他定位命令。

    最终匹配原则包含“~”和“~*”命令。如果找到相对匹配,nginx终止搜索其他匹配;当没有正则表达式或没有匹配到正则表达式时,将应用匹配级别最高的逐句匹配命令。

    到目前为止,这篇关于nginx配置位置匹配标准的解释的文章已经在这里详细介绍过了。有关nginx配置位置匹配标准的大量信息,请搜索您以前的文章或再次访问下面的相关文章。期待你以后的申请!

    欢迎分享,转载请注明来源:内存溢出

    原文地址: http://outofmemory.cn/zz/774594.html

    (0)
    打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
    上一篇 2022-05-03
    下一篇 2022-05-03

    发表评论

    登录后才能评论

    评论列表(0条)

    保存