zoukankan      html  css  js  c++  java
  • Nginx location配置详细解释

    先来说一下Nginx的几种匹配规则,有精准匹配,正则匹配、普通匹配。

    location的命中过程是这样的
    1:先判断精准匹配是否命中,如果命中,立即返回结果并结束解析过程。
    2:如果精准匹配没有命中,判断普通命中,如果有多个命中,记录下来命中长度最长的结果,这里是暂时记录,但不结束。
    3:继续判断正则表达式的解析匹配,按配置里的正则表达式顺序为主,由上到下开始匹配,一旦匹配成功一个,立即返回结果,并结束解析过程。如果正则没有匹配成功,那么根据第二步,如果普通匹配中有最长的匹配结果,那么会按照最长的解析结束返回。
    补充:普通命中顺序无所谓,是因为按照命中的长度来确定。
    正则命中顺序有所谓,是因为从前往后。

    nginx location配置详细解释

    语法规则: location [=|~|~*|^~] /uri/ { … }

    = 开头表示精确匹配

    ^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)。

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

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

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

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

    多个location配置的情况下匹配顺序为(参考资料而来,还未实际验证,试试就知道了,不必拘泥,仅供参考):

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

    例子,有如下匹配规则:

    location = / {
       #规则A
    }
    location = /login {
       #规则B
    }
    location ^~ /static/ {
       #规则C
    }
    location ~ \.(gif|jpg|png|js|css)$ {
       #规则D
    }
    location ~* \.png$ {
       #规则E
    }
    location !~ \.xhtml$ {
       #规则F
    }
    location !~* \.xhtml$ {
       #规则G
    }
    location / {
       #规则H
    }

    那么产生的效果如下:

    访问根目录/, 比如http://localhost/ 将匹配规则A

    访问 http://localhost/login 将匹配规则B,http://localhost/register 则匹配规则H

    访问 http://localhost/static/a.html 将匹配规则C

    访问 http://localhost/a.gif, http://localhost/b.jpg 将匹配规则D和规则E,但是规则D顺序优先,规则E不起作用, 而 http://localhost/static/c.png 则优先匹配到 规则C

    访问 http://localhost/a.PNG 则匹配规则E, 而不会匹配规则D,因为规则E不区分大小写。

    访问 http://localhost/a.xhtml 不会匹配规则F和规则G,http://localhost/a.XHTML不会匹配规则G,因为不区分大小写。规则F,规则G属于排除法,符合匹配规则但是不会匹配到,所以想想看实际应用中哪里会用到。

    访问 http://localhost/category/id/1111 则最终匹配到规则H,因为以上规则都不匹配,这个时候应该是nginx转发请求给后端应用服务器,比如FastCGI(php),tomcat(jsp),nginx作为方向代理服务器存在。

    所以实际使用中,个人觉得至少有三个匹配规则定义,如下:

    #直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,官网如是说。

    #这里是直接转发给后端应用服务器了,也可以是一个静态首页

    # 第一个必选规则

    location = / {
        proxy_pass http://tomcat:8080/index
    }

    # 第二个必选规则是处理静态文件请求,这是nginx作为http服务器的强项

    # 有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用

    location ^~ /static/ {
        root /webroot/static/;
    }
    location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
        root /webroot/res/;
    }

    #第三个规则就是通用规则,用来转发动态请求到后端应用服务器

    #非静态文件请求就默认是动态请求,自己根据实际把握

    #毕竟目前的一些框架的流行,带.php,.jsp后缀的情况很少了

    location / {
        proxy_pass http://tomcat:8080/
    }

    总结:

    1:先判断精准命中,如果命中,立即返回结果并结束解析过程。

    2:普通命中,如果有多个命中,记录下来匹配最长的命中规则(记录但不结束,最长的为准)

    3:继续判断正则表达式的解析结果,按正则表达式的顺序为准,由上到下匹配,如果匹配中了一个,立即结束并结束解析过程

    延伸分析:①普通命中顺序不重要,因为是按照匹配长度来确定。②正则匹配顺序很重要,因为是按照由上到下的顺序

    正则表达式重写例子

    Goods-3.html ---->Goods.php?goods_id=3
    goods-([d]+).html ---> goods.php?goods_id =$1  
    location /ecshop {
    index index.php;
    rewrite goods-([d]+).html$ /ecshop/goods.php?id=$1;
    rewrite article-([d]+).html$ /ecshop/article.php?id=$1;
    rewrite category-(d+)-b(d+).html /ecshop/category.php?id=$1&brand=$2;
     
    rewrite category-(d+)-b(d+)-min(d+)-max(d+)-attr([d.]+).html /ecshop/category.php?id=$1&brand=$2&price_min=$3
    &price_max=$4&filter_attr=$5;
     
    rewrite category-(d+)-b(d+)-min(d+)-max(d+)-attr([d+.])-(d+)-([^-]+)-([^-]+).html /ecshop/category.php?id=$1
    &brand=$2&price_min=$3&price_max=$4&filter_attr=$5&page=$6&sort=$7&order=$8;
    }
  • 相关阅读:
    mybatis-plus 中的LocalDateTime, LocalDate, LocalTime
    mybatis plus 中的Serializable
    JavaSE: FileWriter类 & FileReader类
    JavaSE: IO流的概念
    JavaSE: File类
    JavaSE: 自定义异常
    JavaSE: 异常的抛出
    Vocabulary: hoarse
    JavaSE: finally的使用
    Vocabulary: appalling
  • 原文地址:https://www.cnblogs.com/wt645631686/p/6868463.html
Copyright © 2011-2022 走看看