恭喜您发现了“新大陆”,希望对您有帮助!

nginx服务location区段匹配规则详解

1. location区段

通过指定模式来与客户端请求的URI相匹配

//功能:允许根据用户请求的URI来匹配定义的各location,匹配到时,此请求将被相应的location配置块中的配置所处理,例如做访问控制等功能

//语法:location [ 修饰符 ] pattern {......}

详细语法可以查看nginx官方文档

在配置文件里新加一个location,添加web信息

.............
        location / {
            root   html;
            index  index.php index.html index.htm;
        }

        location /zabbix {
            root   /opt/myweb;      //定义存放目录
            index  index.html;
        }
.............

如果是直接在 /opt/myweb下创建的话,访问会报错,如下图所示
在这里插入图片描述
这时需要注意了, 此时的顺序应该/opt/myweb/zabbix/index.html
所以此时应该先创建zabbix再创建index.html,之后nginx重读文件,再次访问
在这里插入图片描述
刚才那种方式会显得有些繁琐,此时可以把root更改为alias

  ...........
  location /zabbix {
            alias   /opt/myweb;
            index  index.html;
        }
  ...........

此时访问的顺序是 /opt/myweb/index.html
在这里插入图片描述
因为要演示修饰符的效果,所以这里nginx需要重新安装一个echo模块

2. 安装nginx-echo模块

//下载模块
[root@longnian ~]# wget https://github.com/openresty/echo-nginx-module/archive/v0.61.tar.gz

//解压
[root@longnian ~]#  tar xf v0.61.tar.gz

//查看原来的编译参数
[root@longnian ~]# nginx -V
nginx version: nginx/1.18.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC) 
built with OpenSSL 1.0.2k-fips  26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --user=nginx --group=nginx --with-debug --with-http_ssl_module --with-http_realip_module --with-http_image_filter_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_stub_status_module --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log

//重新编译nginx
[root@longnian nginx-1.18.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-debug --with-http_ssl_module --with-http_realip_module --with-http_image_filter_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_stub_status_module --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --add-module=/root/echo-nginx-module-0.61
//在最后加上--add-module=/root/echo-nginx-module-0.61
[root@longnian nginx-1.18.0]# make

//将nginx安装目录中的nginx文件备份
[root@longnian ~]# mv /usr/local/nginx/sbin/nginx /opt

//将我们重新编译的nginx文件复制到nginx安装目录中
[root@longnian ~]#nginx -s stop;cp nginx /usr/local/nginx/sbin/;nginx 
//上面这种方式,在文件启动的时候也能复制进去

//重载配置文件
[root@longnian ~]# nginx -s reload

3. 讲解匹配规则

常用修饰符说明:

修饰符 功能
= 精确匹配
~ 正则表达式模式匹配,区分大小写
~* 正则表达式模式匹配,不区分大小写
^~ 前缀匹配,类似于无修饰符的行为,也是以指定模块<>开始,不同的是,如果模式匹配,那么就停止搜索其他模式了,不支持正则表达式
@ 定义命名location区段,这些区段客户端不能访问,只可以由内部产生的请求来访问,如try_files或error_page等

没有修饰符的情况下

//在配置文件里添加新的location
............
 location /abc {
            echo "没有修饰符";
        }
............

//用curl来访问验证
[root@longnian ~]# curl http://192.168.159.144/abc
没有修饰符
[root@longnian ~]# curl http://192.168.159.144/abc/
没有修饰符
[root@longnian ~]# curl http://192.168.159.144/abc/haha
没有修饰符
[root@longnian ~]# curl http://192.168.159.144/abcd
没有修饰符
[root@longnian ~]# curl http://192.168.159.144/ab
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.18.0</center>
</body>
</html>

通过验证可以发现,只要开头是abc的,后面无论接的什么内容,都能匹配到。最后把abc修改为ab,结果就报错了!
总结就是:

所有请求都可以匹配到,匹配到一个普通格式后,搜索并未结束,而是暂存当前匹配的结果,并继续搜索正则匹配模式 ,匹配到正则就交给正则匹配处理,如果没有匹配到正则就以暂存的结果为匹配结果

修饰符“=”:精准匹配

//在配置文件里添加新的location
............
location = /abc {
            echo "我只能被精准匹配到!";
        }
............

//用curl来访问验证
[root@longnian ~]# curl http://192.168.159.144/abc
我只能被精准匹配到!
[root@longnian ~]# curl http://192.168.159.144/abc/
没有修饰符
[root@longnian ~]# curl http://192.168.159.144/abc/xixi
没有修饰符
[root@longnian ~]# curl http://192.168.159.144/ab
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.18.0</center>
</body>
</html>

通过验证可以看出,/abc用了精准匹配之后,只有在匹配abc的时候才能访问出来,其他任何情况都不能访问到abc
总结就是:

严格匹配,只有完全相等才匹配成功,然后停止匹配,不然继续匹配

修饰符“~”:正则表达式模式匹配,区分大小写

//在配置文件里添加新的location
............
location ~ ^/abc$ {
            echo "我是区分大小写的!";
        }

............

//用curl来访问验证
[root@longnian ~]# curl http://192.168.159.144/abc
我是区分大小写的!
[root@longnian ~]# curl http://192.168.159.144/ABC
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.18.0</center>
</body>
</html>
[root@longnian ~]# curl http://192.168.159.144/abc/
没有修饰符

通过验证可以看出,效果很明显,加上了~,大写的就不能访问到!

修饰符“~*”:正则表达式模式匹配,不区分大小写

//在配置文件里添加新的location
............
location ~* ^/abc$ {
            echo "我是不区分大小写的!";
        }

............

//用curl来访问验证
[root@longnian ~]# curl http://192.168.159.144/abc
我是区分大小写的!
[root@longnian ~]# curl http://192.168.159.144/ABC
我是不区分大小写的!
[root@longnian ~]# curl http://192.168.159.144/abc/
没有修饰符

通过验证可以看出,效果很明显,加上了~*,就不区分了大小写
补充:

~ 和 ~* 实质上是同级的,优先级取决于配置文件书写的先后顺序,先写的优先级高

查找顺序和优先级:由高到底依次为

  • 带有=的精确匹配优先
  • 正则表达式按照他们在配置文件中定义的顺序
  • 带有^~修饰符的,开头匹配
  • 带有*修饰符的,如果正则表达式与URI匹配
  • 没有修饰符的精确匹配

要点总结:

  • location 的匹配顺序是“先匹配普通,再匹配正则”
  • 普通匹配与配置书写顺序无关,因为按照匹配的长短来取匹配结果
  • 正则匹配与顺序有关,因为是从上往下匹配。
  • 正则匹配项匹配规则,受配置文件的前后顺序影响,但普通匹配模式不会
posted @ 2020-08-09 20:16  酷小年  阅读(412)  评论(0编辑  收藏  举报