测试Nginx中location的优先级!

location [=|~|~*|^~] /uri/ { … }

= 开头表示精确匹配
~ 开头表示区分大小写的正则匹配
~* 开头表示不区分大小写的正则匹配
^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,   可以被规则^~ /static/ /aa匹配到(注意是空格)。
!~和!~*分别为区分大小写不匹配及不区分大小写不匹配 的正则
/ 通用匹配,任何请求都会匹配到。

多个location配置的情况下匹配顺序为:
    首先匹配 =,其次匹配^~,其次是按文件中顺序的正则匹配,最后是交给 / 通用匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求。

======================================================================================

前提安装好Nginx后主配置文件如下:(压缩和延时可忽略)

user  nginx nginx;
worker_processes  2;
error_log  logs/error.log  info;
pid        logs/nginx.pid;
events {
   use epoll;
    worker_connections  10240;
}
http {
    include       mime.types;
    default_type  application/octet-stream;

    log_format  main  ‘$remote_addr - $remote_user [$time_local] "$request" ‘
                     ‘$status $body_bytes_sent "$http_referer" ‘
                      ‘"$http_user_agent" "$http_x_forwarded_for"‘;

    access_log  logs/access.log  main;
    sendfile        on;
    server_tokens off;
    keepalive_timeout  65;
    client_header_timeout 60;
    client_body_timeout 60;
    gzip  on;
    gzip_buffers 4 16k;
    gzip_http_version 1.1;
    gzip_comp_level 2;
    gzip_types text/plain text/javascript application/x-javascrip t text/css text/xml
    application/xml application/xml+rss;
    server {
        listen       80;
        server_name  www.source.com;
        charset uft-8;
        access_log  logs/source.com.access.log  main;
     测试区        

location / {
           return 400;
}

location ^~ /test/ {           return 402;}  

location /test {
           return 401;
}

location ^~ /test/aaa/ {
         return 403;
}

location = /test/aaa {
          return 404;
}


#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
      error_page 500 502 503 504 /50x.html;
           location = /50x.html {
           root html;
        }

}

}

每次修改完主配置文件都必须执行如下两条命令:

[[email protected] ~]# nginx -t
[[email protected] ~]# killall -HUP nginx                               //重启nginx

测试理论:故意把低优先级的location放前面,看是否是因为linux的从上而下匹配导致匹配紊乱

第一次测试:多个通配的优先级测试,加入location /test

[[email protected] conf]# curl -v 127.0.0.1:80/test

< HTTP/1.1 401 Unauthorized

测试结果:/test(完整路径)的优先级高于location /(通配)

第二次测试:location正则的优先级测试,我们加入^~/test/,使用正则匹配以test开头的

[[email protected] ~]# curl -v 127.0.0.1:80/test/

< HTTP/1.1 402 Payment Required

测试结果:~^/test的优先级高与/test,也就是说正则location优先级大于完整路径大于通配(前提是完整的正则路径否则返回值为401的完整路径)

[[email protected] ~]# curl -v 127.0.0.1:80/test

< HTTP/1.1 401 Payment Required

测试结果:/test的优先级高与^~/test,也就是说完整路径大于正则

********

第三次测试:多个正则的优先级测试,我们使用两个正则,主要是来验证下,是不是正则配置得越多,优先级就越高。

[[email protected] ~]# curl -v 127.0.0.1:80/test/aaa

< HTTP/1.1 402 Payment Required

测试结果:结果返回402,也就是匹配到第一个正则后,底下的正则不会再去匹配。由于请求/test/aaa/,命中^/test,所以底下的正则就无效了

第四次测试:我们加入精准匹配,也就是nginx的=,我们来测试下精准匹配的优先级

[[email protected] ~]# curl -v 127.0.0.1:80/test/aaa

< HTTP/1.1 404 Not Found

测试结果:返回404。这个说明了,精准匹配=的优先级是最高的,不管它放到哪里。

 总结论:精确匹配 > 完整路径 > 正则 > 通配

原文地址:https://www.cnblogs.com/cxm123123form/p/11539809.html

时间: 2024-10-25 02:47:12

测试Nginx中location的优先级!的相关文章

nginx中location中关于proxy_pass和rewrite的应用

1,问题描述 upstream datacollectbackend{ #ip_hash; server 10.234.1.211:6100 max_fails=5 fail_timeout=30s; server 10.234.1.26:7100 max_fails=5 fail_timeout=30s; } location ~* ^/OCC_DATACO_WEB/.*$ { include deny.conf; proxy_pass http://datacollectbackend; i

nginx之location匹配优先级和安全问题

最近一直在做location的配置,遇到优先级别问题(如有配置不当,会存在安全隐患),以下是个人的一些学习体会 一.location 匹配符 1.等于匹配符:      ##"=" 其特点可概括为两点:   ##1.精确匹配,2.不支持正则表达式 语法示例: 1 location = /static/img/file.jpg { 2 3 ... 4 5 } Code-1 2.空  匹配符: 空匹配符的特点是:   ##1.匹配以指定模式开始的URI,2.不支持正则 语法示例: 1 lo

Nginx中location配置[转]

关于一些对location认识的误区 1. location 的匹配顺序是“先匹配正则,再匹配普通”. 矫正: location 的匹配顺序其实是“先匹配普通,再匹配正则”.我这么说,大家一定会反驳我,因为按“先匹配普通,再匹配正则”解释不了大家平时习惯的按“先匹配正则,再匹配普通”的实践经验.这里我只能暂时解释下,造成这种误解的原因是:正则匹配会覆盖普通匹配(实际的规则,比这复杂,后面会详细解释). 2. location 的执行逻辑跟 location 的编辑顺序无关. 矫正:这句话不全对,

nginx 中location和root,你确定真的明白他们关系?

最近公司开发新项目,web server使用nginx,趁周末小小的研究了一下,一不小心踩了个坑吧,一直404 not found!!!!!当时卡在location和root中,但是网上却比较少聊这方面的关系,一般都是聊location匹配命令(这里可以看看http://www.nginx.cn/115.html),花了一下午,彻底搞清楚了location和root到底怎样找到文件的. nginx指定文件路径有两种方式root和alias,这两者的用法区别,使用方法总结了下,方便大家在应用过程中

关于Nginx中Location配制

以前都是以二级域名配制项目,近期业务需要,需要在一个域名下进行二级扩展(例:www.guodong.com/a/ www.guodong.com/b/ )闲话不多说,直接上图 对Location一些理解:admin.guodong.com/sfaadmin项目全路径:/data/www/ceo/sfaadmin域名中的sfaadmin对应全路径中的sfaadmin.希望对你有用. 原文地址:https://blog.51cto.com/709151/2430102

nginx中location中的

http://blog.sina.com.cn/s/blog_647a022e01016140.html http://bbs.csdn.net/topics/330099906 http://www.cnblogs.com/AaronLi/archive/2011/09/02/2164355.html http://blog.csdn.net/qiluluwawa/article/details/8096110 http://bbs.csdn.net/topics/390943510 http

Nginx中的一些匹配顺序总结

Nginx中经常需要做各种配置,总结如下: 1.server_name配置 nginx中的server_name指令主要用于配置基于名称虚拟主机,同一个Nginx虚拟主机中,可以绑定多个server_name,各个域名用空格隔开即可.如下: server { listen 80; server_name test.com www.test.com; ... ... } 如果server_name有多个,那么通过代码如$_SERVER["SERVER_NAME"]获取的始终将是Nginx

nginx location 规则优先级

一 nginx  location 匹配命令 ~   #表示执行一个正则匹配,区分大小写 ~*  #表示执行一个正则匹配,不区分大小写 ^~  #表示普通字符匹配,如果该选项匹配,只匹配该选项, 不匹配别的选项,一般用来匹配目录 =   #进行普通字符精确匹配 二 nginx location 匹配优先级(与location在配置文件中的顺序无关) 1=  精确匹配.如果发现精确匹配,nginx停止搜索其他匹配模式. 2    普通字符匹配,正则表达式规则和长的块规则将被优先和和查询匹配,也就是

nginx location的优先级

原来一直以为location的优先级是先后顺序,结果有次项目中傻眼了,赶紧百度一下,下面的内容参考了这个链接 location表达式类型 ~ 表示执行一个正则匹配,区分大小写~* 表示执行一个正则匹配,不区分大小写^~ 表示普通字符匹配.使用前缀匹配.如果匹配成功,则不再匹配其他location.= 进行普通字符精确匹配.也就是完全匹配.@ "@" 定义一个命名的 location,使用在内部定向时,例如 error_page, try_files location优先级说明 在ngi