`
fantaxy025025
  • 浏览: 1309260 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

nginx_location匹配规则

 
阅读更多

 

    nginx的配置指令的作用域可以分为 main,server,location这3个种,实际上这3者不是依次包含的关系,而是相互独立的关系,比如一个只具有main级别作用域的指令,是不能写在某个server或者location内的,模块的某个指令可以同时具有main,server,location这3种作用域,另外每个模块有 main,srv,loc这3个级别的配置,一个模块的main级别的配置对所有的server和location都是共享的,srv级别的配置对所有 location都是共享的,location只有自己独立的loc级别的配置,这就是为什么一个模块的srv和loc级别的配置需要merge,而 main级别的配置不需要merge的原因。这里看起来有点绕,区分一下main,server,location分别作为一种作用域级别和一个主体,类似于形容词和名字的区别,nginx的配置关系还是不难理解的。

        一般来说一个请求url过来,nginx会将它解析到某一个location来处理。这个解析的过程实际上根据location的配置基本可以分为字符串匹配和正则表达式匹配这2种。对于location的组织方式,最简单的就是直接将它们保存为一个链表,解析url的时候一个一个遍历即可找到相应location,但是这样效率太低,对像nginx这种高性能的服务器来说是完全不可取的,nginx将字符串匹配的location组织成了一个三叉的字符串排序树,而且建立的时候也考虑了树的平衡性。文章后面我讲详细介绍源码的实现。

 

        首先我来大概的介绍一下location的种类和匹配规则,以nginx wiki(http://wiki.nginx.org/HttpCoreModule#location)的例子做说明:

location 优先级官方文档

  1. Directives with the = prefix that match the query exactly. If found, searching stops.
  2. All remaining directives with conventional strings, longest match first. If this match used the ^~ prefix, searching stops.
  3. Regular expressions, in order of definition in the configuration file.
  4. If #3 yielded a match, that result is used. Else the match from #2 is used.
  1. =前缀的指令严格匹配这个查询。如果找到,停止搜索。
  2. 所有剩下的常规字符串,最长的匹配。如果这个匹配使用^〜前缀,搜索停止。
  3. 正则表达式,在配置文件中定义的顺序。
  4. 如果第3条规则产生匹配的话,结果被使用。否则,如同从第2条规则被使用。

 

例如

location  = / {
  # 只匹配"/".
  [ configuration A ] 
}
location  / {
  # 匹配任何请求,因为所有请求都是以"/"开始
  # 但是更长字符匹配或者正则表达式匹配会优先匹配
  [ configuration B ] 
}
location ^~ /images/ {
  # 匹配任何以 /images/ 开始的请求,并停止匹配 其它location
  [ configuration C ] 
}
location ~* \.(gif|jpg|jpeg)$ {
  # 匹配以 gif, jpg, or jpeg结尾的请求. 
  # 但是所有 /images/ 目录的请求将由 [Configuration C]处理.   
  [ configuration D ] 
}

 

       可以看到上面的例子中有5种不同类型的location,其中第4个带 “~” 号前缀的为需要正则匹配的location,nginx在进行url解析时对这5种不同类型的location具有不同的优先级规则,大致的规则如下:

1,字符串精确匹配到一个带 “=” 号前缀的location,则停止,且使用这个location的配置;

2,字符串匹配剩下的非正则和非特殊location,如果匹配到某个带 "^~" 前缀的location,则停止;

3,正则匹配,匹配顺序为location在配置文件中出现的顺序。如果匹配到某个正则location,则停止,并使用这个location的配置;否则,使用步骤2中得到的具有最大字符串匹配的location配置。

       例如,对下面的请求有:

1, /   ->   精确匹配到第1个location,匹配停止,使用configuration A
2,/some/other/url    ->  首先前缀部分字符串匹配到了第2个location,然后进行正则匹配,显然没有匹配上,则使用第2个location的配置configurationB
3,/images /1.jpg  ->  首先前缀部分字符串匹配到了第2个location,但是接着对第3个location也前缀匹配上了,而且这时已经是配置文件里面对这个url的最大字符串匹配了,并且location带有 "^~" 前缀,则不再进行正则匹配,最终使用configuration C
4,/some/other/path/to/1.jpg  -> 首先前缀部分同样字符串匹配到了第2个location,然后进行正则匹配,这时正则匹配成功,则使用congifuration D

 

请求URI例子:

  • / -> 符合configuration A
  • /documents/document.html -> 符合configuration B
  • /images/1.gif -> 符合configuration C
  • /documents/1.jpg ->符合 configuration D

@location 例子
error_page 404 = @fetch;

location @fetch(
proxy_pass http://fetch;
)

 

location匹配命令

~      #波浪线表示执行一个正则匹配,区分大小写
~*    #表示执行一个正则匹配,不区分大小写
^~    #^~表示普通字符匹配,如果该选项匹配,只匹配该选项,不匹配别的选项,一般用来匹配目录
=      #进行普通字符精确匹配
@     #"@" 定义一个命名的 location,使用在内部定向时,例如 error_page, try_files

 

 

location 匹配的优先级(与location在配置文件中的顺序无关)
= 精确匹配会第一个被处理。如果发现精确匹配,nginx停止搜索其他匹配。
普通字符匹配,正则表达式规则和长的块规则将被优先和查询匹配,也就是说如果该项匹配还需去看有没有正则表达式匹配和更长的匹配。
^~ 则只匹配该规则,nginx停止搜索其他匹配,否则nginx会继续处理其他location指令。
最后匹配理带有"~"和"~*"的指令,如果找到相应的匹配,则nginx停止搜索其他匹配;当没有正则表达式或者没有正则表达式被匹配的情况下,那么匹配程度最高的逐字匹配指令会被使用。

 

参考:

http://www.nginx.cn/115.html

http://wiki.nginx.org/HttpCoreModule#location

 

 

 

 

分享到:
评论

相关推荐

    nginx_location

    - 访问 `/login` 会匹配规则 B,而 `/register` 会匹配规则 H。 - 访问 `/static/a.html` 会匹配规则 C。 - 图片请求如 `/a.gif` 和 `/b.jpg` 会匹配规则 D,但顺序优先,规则 E 不起作用。`/static/c.png` 匹配...

    Nginx关于location的匹配规则详解.docx

    **Nginx中的Location匹配规则详解** 在Nginx服务器配置中,`location`指令是核心部分之一,用于处理HTTP请求。它根据指定的规则来匹配URL,从而决定如何处理客户端的请求。本文将深入探讨Nginx `location`的匹配...

    nginx的server和location匹配规则

    Nginx 服务器和 Location 匹配规则 Nginx 配置文件主要由 events、http、server、location、upstream 等块配置项和一些行配置项组成。Server 块匹配规则是 Nginx 配置文件中的一部分,对虚拟主机的相关参数进行配置...

    Nginx_URL重写模块(已译)

    * 重写规则只匹配相对路径而不是绝对的 URL,如果想匹配主机名,可以加一个 if 判断。 * 如果替换的字符串以 http://开头,请求将被复位向,并且不再执行多余的 rewrite 指令。 * nginx 将在复位向的过程中使用匹配 ...

    nginx location匹配实例详解

    Nginx配置指令location匹配符优先级和安全问题详解Nginx location 匹配规则Nginx服务器的location指令匹配规则详解利用nginx如何匹配多个条件Nginx location匹配规则的方法示例简介Nginx中的location匹配规则nginx ...

    nginx_install.zip

    - `location`块:基于请求URI匹配规则,设置具体的路由和处理方式,如静态文件服务、反向代理等。 4. **反向代理**:Nginx常用作反向代理服务器,将客户端请求转发到后端应用服务器,如PHP-FPM、Tomcat等,以实现...

    Nginx location匹配规则的方法示例

    Nginx的location匹配规则非常灵活和强大,可以实现精确匹配、前缀匹配、正则表达式匹配等多种方式。在配置Nginx服务器时,了解location匹配规则的方法至关重要。 location块中的匹配规则可以根据不同的符号进行分类...

    详解Nginx location 匹配规则

    正确配置location匹配规则,可以极大地提升Web服务器的性能和效率。理解每种修饰符和匹配顺序是配置正确规则的关键。在具体应用中,还需要根据实际的Web应用结构和性能要求来细化配置,确保每个请求都能得到最合适的...

    nginx配置优化+负载均衡+动静分离详解.zip_nginx_nginx 负载_优化_优化配置_负载均衡

    1. **location指令**:通过location匹配规则,将静态资源请求直接返回,动态请求转发给后端应用服务器。 2. **root和alias**:设置静态文件的根目录,root用于相对路径,alias用于绝对路径。 3. **缓存(proxy_cache...

    简介Nginx中的location匹配规则

    location匹配命令 ~ #波浪线表示执行一个正则匹配,区分大小写 ~* #表示执行一个正则匹配,不区分大小写 ^~ #^~表示普通字符匹配,如果该选项匹配,只匹配该选项,不匹配别的选项,一般用来匹配目录 = #进行普通...

    Nginx 反向代理 location 语法规则说明

    当有匹配成功时候,停止匹配,按当前匹配规则处理请求。 示例 下面是一些示例 Location 规则: ``` location = / { ... } # 精确匹配根目录 location = /login { ... } # 精确匹配 /login location ^~ /static/ { ...

    nginx配置location时容易出现的误区

    ### Nginx 配置 Location 时常见...总之,在配置 Nginx 时,正确理解和使用 `location` 的匹配规则和 `root`、`alias` 的区别是非常重要的。只有深入掌握这些概念,才能更高效地利用 Nginx 进行 Web 服务器的配置管理。

    nginx-1.17.9_nginx_

    6. **URL 重写**:Nginx 支持 URL 重写规则,可以方便地实现 URL 美化和SEO优化。 **二、Nginx 的配置结构** Nginx 的配置文件通常为 `nginx.conf`,采用模块化的配置结构,包括全局块、events块、http块、server...

    nginx_pcre.rar

    Nginx利用PCRE库来解析和执行复杂的URL模式匹配规则。PCRE库提供了与Perl语言正则表达式语法和行为相兼容的功能,使得Nginx能够灵活地定义和处理URL路径,例如实现动态路由、URL重写等高级功能。 在安装Nginx时,...

    一文弄懂Nginx的location匹配的实现

    学习location匹配规则对于理解如何在Nginx中配置服务器和优化网站性能至关重要。 location指令有多种匹配方式,具体包括精确匹配(=)、正则表达式匹配(~和~*)、最前缀匹配(^~)以及前缀匹配。它们都遵循特定的...

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

    在本文中,我们将深入探讨Nginx服务器配置中的核心组件之一——`location`匹配规则。`location`指令在Nginx配置中起着至关重要的作用,因为它决定了如何根据请求的URL路由请求。让我们逐步了解其工作原理和配置实例...

    nginx_conf.zip

    `location`块是Nginx配置中最灵活的部分,可以根据URL规则进行匹配,并执行相应的处理逻辑。如上所示,`location = /50x.html`是精确匹配,`location /`则是匹配所有路径。 五、反向代理与负载均衡 Nginx作为反向...

Global site tag (gtag.js) - Google Analytics