美文网首页
Nginx路由详解

Nginx路由详解

作者: 南风nanfeng | 来源:发表于2019-05-27 09:55 被阅读0次

    本文总结Nginx的location配置策略。结合案例说明location的用法。

    location配置语法:location [=|~|~*|^~] /uri/ { … }
    1、 =。精确匹配查血前缀,如果找到路径,则停止向下匹配。
    2、 ~。使用正则表达式匹配,该符号表示大小写敏感。
    3、 ~*。使用正则表达式匹配,表示大小写不敏感。
    4、 ^~。匹配常规字符串,表示以该字符串开头的路径。

    相对应的四个经典案例介绍

    location = / {
        #精确匹配,只匹配/查询
    }
    
    location / {
        #匹配任何查询,所有请求都是以/开头。但是正则表达式规则和长的块规则将被优先匹配和查询;
    }
    
    location ^~ /images/ {
        # 匹配任何已 /images/ 开头的任何查询并且停止搜索。任何正则表达式将不会被测试。
    }
    
    location ~* \.(gif|jpg|png)${
        #匹配任何以gif、jpg、png结尾的请求。然后所有/images/目录的请求将使用第三个
    }
    
    例子请求:
    
    / -> configuration A
    
    /documents/document.html -> configuration B
    
    /images/1.gif -> configuration C
    
    /documents/1.jpg -> configuration D
    
    

    下面是详细的八个案例:

    location = / { 
        #精确匹配,/后面不能加任何字符串,符合此条件就直接返回数据,不再像下匹配。
        if (-d $request_filename) {
             root /usr/local/nginx/html/;  #当用户访问newweb的时候,则显示此目录的内容,除此之外访问其他的任何目录都不匹配。
      [动作A]
    }
    
    location  / {
        #因为所有的地址都以/开头,所以这条规则将匹配到所有请求,但是非精确匹配会采取正则和最长字符串会优先匹配,因此还会向下继续匹配,比如当访问/bbs的时候,还需要看下面是否更精确的匹配。
        [ 动作B] 
    }
    
    location /documents/ {
        # 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索
        # 如果后面的正则表达式都没有匹配到,就匹配这一条
        [动作C] 
    }
    
    location ^~ /images/ {   
      # 匹配任何以/images/ 开头的任何请求并且停止搜索,后面任何正则表达式将不会被测试。
      [动作D] 
    }
    
    location ~* \.(gif|jpg|jpeg)$ { 
        #~* 为不区分大小写
        # 匹配所有以 gif,jpg或jpeg 结尾的请求
        # 然而,所有请求/images/下的图片会被动作D匹配处理,因为动作D有^~会优先匹配并终止匹配,所以到达不了这一条正则
        [动作E] 
    }
    
    location /images/ {
        # 字符匹配到 /images/,继续往下,会发现 ^~ 存在,如果动作D存在,则这一条就不生效。
        [动作F] 
    }
    
    location /images/abc {
        #最长字符匹配到 /images/abc,继续往下,会发现 ^~ 存在,如果D存在,则这一条就不生效。
        #F与G的放置顺序是没有关系的
        [动作G] 
    }
    
    location ~ /images/abc/ {
        # 动作D存在,这一条不生效,如果注销动作D,则会优先最长匹配 动作G 开头的地址,然后向下匹配,到这一条的时候就会匹配并生效。
        [ configuration H ] 
    }
    
     匹配优先级,顺序 no优先级:
    (location =) > (location 完整路径) > (location ^~ 路径) > (location ~,~* 正则顺序) > (location 部分起始路径) > (/)
    
    上面的匹配结果
    按照上面的location写法,以下的匹配示例成立:
    
    / -> config A
    精确完全匹配,即使/index.html也匹配不了
    
    /downloads/download.html -> config B
    匹配B以后,往下没有任何匹配,采用B
    
    /images/1.gif -> configuration D
    匹配到F,往下匹配到D,停止往下
    
    /images/abc/def -> config D
    最长匹配到G,往下匹配D,停止往下
    你可以看到 任何以/images/开头的都会匹配到D并停止,FG写在这里是没有任何意义的,H是永远轮不到的,这里只是为了说明匹配顺序
    
    /documents/document.html -> config C
    匹配到C,往下没有任何匹配,采用C
    
    /documents/1.jpg -> configuration E
    匹配到C,往下正则匹配到E
    
    /documents/Abc.jpg -> config CC
    最长匹配到C,往下正则顺序匹配到CC,不会往下到E
    

    相关文章

      网友评论

          本文标题:Nginx路由详解

          本文链接:https://www.haomeiwen.com/subject/hdhctctx.html