zoukankan      html  css  js  c++  java
  • 测试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;
            }   

        }

    }

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

    [root@localhost ~]# nginx -t
    [root@localhost ~]# killall -HUP nginx                               //重启nginx

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

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

    [root@localhost conf]# curl -v 127.0.0.1:80/test

    < HTTP/1.1 401 Unauthorized

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

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

    [root@localhost ~]# curl -v 127.0.0.1:80/test/                        

    < HTTP/1.1 402 Payment Required

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

    [root@localhost ~]# curl -v 127.0.0.1:80/test

    < HTTP/1.1 401 Payment Required   

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

    ********

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

    [root@localhost ~]# curl -v 127.0.0.1:80/test/aaa

    < HTTP/1.1 402 Payment Required

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

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

    [root@localhost ~]# curl -v 127.0.0.1:80/test/aaa

    < HTTP/1.1 404 Not Found

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

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

  • 相关阅读:
    入职linux基本命令学习
    C++大师Stan Lippman:我对中国程序员的忠告
    Create Your Own Search Engine with Python
    获取相加等于某个值的集合
    关于mysql的连接数问题
    修改Windows2003Server的Telnet默认端口(23)为其它端口的方法
    解决WCF传输大数据量时出错并提示:远程主机强迫关闭了一个现有的连接
    IIS服务器静态网页被挂马和解决方法(ZT)
    CAD2016 Object Arx开发环境搭建与HelloWorld实现
    我的Java之路(5)
  • 原文地址:https://www.cnblogs.com/CMX_Shmily/p/11539809.html
Copyright © 2011-2022 走看看