首页 > 系统相关 >nginx之location规则详解

nginx之location规则详解

时间:2023-07-01 15:23:51浏览次数:39  
标签:匹配 路径 bbb nginx 正则 html location 详解

一、语法规则:

  • = 开头表示精确匹配

  • ^~ 开头表示uri以某个常规字符串开头,理解为匹配url路径即可(非正则)

  • ~ 开头表示区分大小写的正则匹配

  • ~* 开头表示不区分大小写的正则匹配

  • !~!~*分别为区分大小写不匹配及不区分大小写不匹配的正则

  • / 通用匹配,任何请求都会匹配到

优先级:

  • 等号类型(=)的优先级最高。一旦匹配成功,则不再查找其他location的匹配项

  • ^~和通用匹配。使用前缀匹配,不支持正则表达式,如果有多个location匹配成功的话,不会终止匹配过程,会匹配表达式最长的那个(下方有例子)

  • 如果上一步得到的最长的location为^~类型,则表示阻断正则表达式,不再匹配正则表达式

  • 如果上一步得到的最长的location不是^~类型,继续匹配正则表达式,只要有一个正则成功,则使用这个正则的location,立即返回结果,并结束解析过程

  • 以上,我们可以得出一个结论:优先使用正则表达式,如果没有匹配的正则表达式发现,则使用匹配的最长前缀字符串location

    location  = / {
      # 精确匹配 / ,主机名后面不能带任何字符串
      [ configuration A ]
    }location  / {
      # 因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求
      # 但是正则和最长字符串会优先匹配
      [ configuration B ]
    }location /documents/ {  # 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索
      # 只有后面的正则表达式没有匹配到时,这一条才会采用这一条
      [ configuration C ]
    }location ~ /documents/Abc {  # 匹配任何以 /documents/Abc 开头的地址,匹配符合以后,还要继续往下搜索
      # 只有后面的正则表达式没有匹配到时,这一条才会采用这一条
      [ 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

     

二、验证:

1、精确匹配:

在conf.d文件夹下创建配置文件test.com.conf,内容如下:

 

上图中第一个和第二个location匹配条件一样,都是/test.html,但第二个为精准匹配到静态路径,因此第一个不会执行,会执行第二个,www.test.com为本地域名解析,access_log和error_lor可以单独为每个模块定义日志

通过域名和路径访问后的内容如下:

 

注意:路径/usr/share/nginx/test_html文件夹下需要有test.html才可以正常访问

上图中指定静态资源路径用的关键字root,还可以用alias,那么root和alias的区别是什么?

  • 用root属性指定的值是要加入到最终路径中的,匹配条件会拼接到路径中

  • 用alias属性指定的值不需要加入到最终路径中

如上图中所示,请求的条件为test.html,通过root指定的路径为/usr/share/nginx/test_html,因此在匹配的时候,这个路径下就必须要有test.html这个文件才可以,否则就会找不到而报错,如果用alias,那么通过浏览器进行请求的时候,alias也是指定到/usr/share/nginx/test_htm路径下,但是会匹配默认的index.html,而无须强制匹配test.html,但是此时就不能使用”=”来进行精确匹配,现在将root改为alias,如图:

 

注意:alias指定的路径结尾要加”/”

下面的配置文件采用roo指定路径,当通过域名请求http://www.test.com/html/的时候,将跳转到/usr/share/nginx/html/下的index.html页面,如图:

 

下面的配置文件采用alias指定路径,请求http://www.test.com/linshi/的时候,将跳转到/usr/share/nginx/test_html/index.html页面,如图:

2、通过^~方式实现匹配:

例如:下面配置文件有两条规则,分别匹配url以字母a开头,但是长度不同,首先将长的规则先注释掉,如图:

通过curl请求查看状态码,如图:

 

说明:当前只有一个规则开启,因此当匹配url以/a/开头的任何url时,都会返回状态码666

现在将第二条规则注释取消,打开规则,如图:

 

再次发起同样的请求,观察返回状态码,如图:

 

从上图可以看出,两条规则同时被匹配成功,但是第二条规则比较长,因此第二条规则优先被匹配,如果^~匹配成功了,那么表示阻断正则表达式,不再进行正则匹配

3、通过”~”方式实现匹配:

上图中的匹配规则都是通过”^~”方式来实现的,那么在匹配最长规则的时候又分为两种情况:

  • 第一种:最长规则通过^~来实现匹配(上图中的最长规则就是通过^~实现)

  • 第二种:最长的规则不是通过^~实现匹配,而是通过普通匹配来实现

当最长规则是通过普通匹配的时候,将会继续正则匹配, 只要有一个正则成功,则使用这个正则的location,停止继续匹配,返回结果

现在将第二条规则改为普通匹配,并添加一条正则匹配,如图:

 

再次执行同样的请求命令,得到的状态码如下:

 

说明:从上图可以看出请求/a/b/的时候,首先会到达第二条规则(最长规则),由于第二条规则为普通匹配(不是^~匹配),因此会继续去匹配正则,也就是第三条规则,因此最终返回状态码为888

4、通过"~*"方式实现匹配:

” ~* ” 表示不区分大小写的正则匹配

例如:通过url请求/a/b/或者/A/B/,查看返回状态码,如图:

 

请求结果如下:

 

从上图可以看出,无论匹配的是大写还是小写,都会返回对应状态码888

常用方法还有匹配图片后缀,并返回指定信息,如图:

 

 

5、”!~*” 和”!~” 不常用,再次不做介绍

6、通过”/” 实现通用匹配:

本例子中,9091服务为httpd

第一种情况:proxy_pass最后面没有斜杠,匹配路径有斜杠(/bbb/),如图:

说明:proxy_pass最后面没有斜杠”/”,此时通过浏览器请求http://10.9.2.248/bbb/,那么实际访问的地址就是 http://10.9.2.248:9091/bbb/,会将匹配路径/bbb一起加过去

此时如果在http的目录页面目录htdocs中创建目录bbb,在bbb目录下创建文件index.html,然后即可实现正常访问,如图:

 

第二种情况: proxy_pass最后面有斜杠 “/”,匹配路径也有斜杠(/bbb/),如图:

 

说明:proxy_pass最后面有斜杠”/”,此时通过浏览器请求http://10.9.2.248/bbb/,那么实际访问的地址就是 http://10.9.2.248:9091,会将/bbb抛弃的,如图:

 

第三种情况:proxy_pass后面还有其他路径但是最后没有 “/”, 匹配路径也有斜杠(/bbb/) ,如图:

 

说明,此时通过浏览器访问http://10.9.2.248/bbb/index.html,实际请求的是http://10.9.2.248/cxxindex.html(注意位置是默认路径下,不是ccc路径下,如果proxy_pass的路径为/ccc/ddd,那么实际请求的就是ccc路径下的cccindex.html)

在httpd的默认路径下(htdocs)创建文件cxxindex.html,然后访问,如图:

第四种情况: proxy_pass后面还有其他路径但是最后有 “/”, 匹配路径也有斜杠(/bbb/) ,如图:

说明:此时通过浏览器访问:http://10.9.2.248/bbb/index.html,实际访问的是http://10.9.2.248/ccc/index.html

在httpd默认路径下(htdocs)创建一个名称为ccc的文件夹,在内部定义一个index.html,然后访问,如图:

 

第五种情况:location匹配路径末尾没有 “/”,proxy_pass后面也没有”/”,如图:

 

说明:8081端口为httpd的服务器端口,如果匹配路径和proxy_pass后都没有”/”,那么此时访问http://10.9.2.248/bbb,默认将请求到http://127.0.0.1:8081/bbb/index.html的内容,此时在httpd默认路径htdocs下创建文件夹bbb,内部创建index.html,定义内容为:i am match bbb,通过IP请求如图:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

标签:匹配,路径,bbb,nginx,正则,html,location,详解
From: https://www.cnblogs.com/Fooo/p/17519317.html

相关文章

  • nginx之proxy_pass规则详解
    在nginx中配置proxy_pass代理转发时,如果在proxy_pass后面的url加/,表示绝对根路径;如果没有/,表示相对路径,把匹配的路径部分也给代理走。假设下面四种情况分别用http://192.168.1.1/proxy/test.html进行访问。第一种:location/proxy/{proxy_passhttp://127.0.0.1/;}代......
  • 使用uni.app 里面 uni.chooseLocation api 打开地图位置 踩坑 踩坑 地图搜索 和列
    用 Android基座可以正常使用真机调试也可以用就是打包的时候打包完毕弹出地图之后搜索一直转圈  地图列表没有东西也是一直转圈里面有好多踩坑点  太狗了  要打包的 包名  和 dcloud里面的包名 和如果用高德地图里面的  packagename三......
  • gcc/g++ 编译选项详解
    编译步骤gcc与g++区别gcc命令的常用选项编译优化选项-O优化-O1优化-O2-O0-Os-Ofast-Og-Oz-O选项控制特定的优化WarningsReference编译步骤gcc、g++分别是gnu的c&c++编译器。实际上,GCC能够编译三种语言:C、C++和Ob......
  • 【胖虎的逆向之路】——GOT/PLT Hook详解&针对自定义so库的Hook实操
    文章目录@[TOC](文章目录)前言一、ELF是什么?1、ELF的概念2、ELF的组成2.1、两种视图是什么呢?2.2、ELF文件头又是什么西西?2.2、ELF中节头表是什么南南呢?2.2、ELF中程序头表是什么北北呢?二、动态库装载、动态链接与重定位简单理解1、装载2、动态链接3、重定位三、PLT与GOTHoo......
  • find命令mtime,ctime,atime详解
    1.查找时间说明find./-name“*data*”-mtime+1当前目录下文件名包含data,而且修改时间在48小时以上的find./-name“*date*”-mtime+2当前目录下文件名包含data,而且修改时间在72小时以上的find./name“*data*”-mtime-1当前目录下文件名包含data,而且修改时间在24......
  • centos7安装nginx
    1.tar-zxvfnginx-1.6.2.tar.gz2.yuminstall-ygccpcre-develzlib-developensslopenssl-devel 3. ./configure4.删除-Werror,这个文件在/nginx-1.6.2/objs/Makefile 5. 删除下面这句话  文件在/src/os/unix/ngx_user.c ......
  • 使用 Dockerfile 自定义 Nginx 镜像
    一般来说,自定义Nginx只需要把静态文件放到镜像里就可以了,不需要重写 CMD 与 ENTRYPOINT。但是,如果的确需要在Nginx启动前执行一些操作,就需要重写 CMD 了,如果写成下边就样: FROMnginx COPYsomeshell.sh/ RUNchmod+x/someshell.sh CMDsomeshell.s......
  • Nginx七层转发&URL转发
    URL转发应用场景根据HTTP的URL转发的场景,被称之为七层转发(应用层转发),然而LVS的负载均衡一般用于TCP的转发,也就被称之为4层转发。利用Nginx的七层转发,可以实现动静分离,移动、PC端页面区分,交给不同的后端服务器处理,让用户得到更佳的访问体验。通过$http_user_agent获取,根据该变......
  • nginx配置开机启动及配置sudo授权启动
    2、sudo授权其它用户启动(1)root用户编辑visudoroot   ALL=(ALL)      ALLelk    ALL=(root)      NOPASSWD:/etc/init.d/nginx,/usr/local/nginx/sbin/nginx(2)切换用户启动nginx[elk@testroot]$sudo/usr/local/nginx/sbin/nginx[sudo]passwordfore......
  • Docker网络管理_Docker0网络详解
    Docker网络管理_Docker0网络详解清空所有容器来测试dockerstop$(dockerps-aq)dockerrm$(dockerps-aq)思考注意:每启动一个docker容器,docker就会给容器分配一个ip,只要安装docker就会有一个docker0网卡。evth-pair技术evth-pair就是一对的虚拟设备接口,它们都......