nginx入门详解(七)- 匹配规则

作者: 运维朱工 | 来源:发表于2019-07-25 15:34 被阅读0次

    Location 基础知识:

    概念:

    我们可以通过配置Location指令块,来决定客户端发过来的请求URI如何处理。

    语法:
    Syntax: location [ = | ~ | ~* | ^~ ] uri { ... }
    location @name { ... }
    Default:    —
    Context:    server, location
    
    

    location 配置可以<mark style="box-sizing: border-box;">有两种配置</mark>方法,可以在server指令块和location指令块配置。

    1、修饰符 + uri(资源路径)

    2、@ + name

    修饰符:
     =  :精确匹配(必须全部相等)
     ~  :大小写敏感(正则表达式)
     ~* :忽略大小写(正则表达式),这里要注意忽略大小写的意思是请求的字符大小写都可以,
     但是不会进行大小转换,请求的大小写对应的文件必须存在。
     ^~ :只需匹配uri部分
     @  :内部服务跳转
    
    

    Location 配置实例:

    1、=,精确匹配,一般是匹配某个具体文件。

     location = /index.html {
         [ configuration ] 
     }
     # 则匹配到`http://www.lutixia.com/index.html`这种请求。 
    
    

    还有这种写法,精准匹配/,可以加快首页访问速度。

    location = / {
         root html;
         index index.html;
     }
    
    

    有一点需要注意,如果想变更根目录,比如把根目录设置为/usr/local/nginx/html/lutixia,那么直接这么写可能会出问题,假如原根目录(html)没有index.html文件,会报404。

     location = / {
         root /usr/local/nginx/html/lutixia;
         index index.html;
     }
     如果写成这样的话,即使lutixia目录下有index.html,也会直接报错,
     报找不到文件,可是里面明明有文件呀。
    
    
    解释:
    当我们访问www.lutixia.com/时,确实匹配到了这个location,
    但是这个时候请求的前缀会变成/index.html,所以已经不再匹配这个localtion规则。
    因为找不到其他匹配规则,
    所以默认会去匹配根目录下(html)的文件,但是这时根目录下的index.html不存在,
    所以报错404。
    
    

    同样的,如果lutixia目录里面有其他的文件,我们通过这个localtion规则也是无法访问的, 因为它只匹配/,其他的url都不再是它匹配。

    那么怎么解决这个问题呢?可以在加一个location。
    location = / {
                    root html/lutixia;
                    index index.html;
            }
            location  / {
                    root html/lutixia;
                    index index.html;
            }
    
    通过加这个location,凡是没有匹配到的资源会到/目录下去找
    ,根的目录重新定义了,所以可以实现这个需求。
    
    

    2、~,大小写敏感(正则表达式)

    location ~ /LUTIXIA/ {
             [ configuration ] 
        }
        #请求示例
        #http://www.lutixia.com/LUTIXIA/  [成功]
        #http://www.lutixia.com/lutixia/  [失败]
    

    3、~*,大小写忽略(正则表达式)

    location ~* /LUTIXIA/ {
               [ configuration ] 
    }
    # 则会忽略 uri 部分的大小写
    #http://www.lutixia.com/LUTIXIA/  [成功] 可以成功匹配,但是目录中要LUTIXIA文件
    #http://www.lutixia.com/lutixia/  [成功] 可以成功匹配,但是目录中要lutixia文件
    

    4、^~,只匹配以 uri 开头,匹配成功以后,会停止搜索后面的正则表达式匹配

    location ^~ /img/ {
           [ configuration ] 
    }
    #以 /img/ 开头的请求,都会匹配上
    #http://www.lutixia.com/img/lutixia.jpg   [成功]
    #http://www.lutixia.com/img/lutixia.png [成功]
    

    5、匹配以gif、jpg、jpeg结尾的文件

    location ~* \.(gif|jpg|jpeg)$ {
        [ configuration ] 
    }
        #http://www.lutixia.com/img/lutixia.jpg [成功] 
    
    

    如果配置了4,那么所有请求 /img/ 下的图片会被上面4处理,因为 ^~ 指令匹配到了,则不检查正则表达式。

    5、@,nginx内部跳转

    location /data/ {
        error_page 404 @img_err;
    }
    
    location @img_err {
       [ configuration ] 
    }
    #以 /data/ 开头的请求,如果链接的状态为 404。则会匹配到 @img_err 这条规则上。
    

    同时有多个location时,优先级如下:

    完整范例:

    这里有一简短的localtion配置:
    
            location  /img/ {
                    echo " /img/";
            }
            location ~ /img/ {
                    echo "~ /img/";
            }
            location ~* /img/ {
                    echo "~* /img/";
            }
            location ^~ /img/ {
                    echo "^~ /img/";
            }
            location = /img/ { 
                    echo "=  /img/";
            }
    
    

    如果客户端的请求是:

    http://192.168.0.116/img/
    
    

    那么按照匹配规则顺序应该是这样的:

    第一步:取出uri:/img/

    第二步:去匹配localtion规则,查找有没有 = /img/的规则,有则停止匹配。

    [root@www ~]# curl 192.168.0.116/img/
    =  /img/
    
    

    第三步:将location = /img/规则注释,继续查找有没有 ^~ /img/的规则,

    [root@www ~]# curl 192.168.0.116/img/
    ^~ /img/
    
    

    第四步:将 location ^~ /img/注释,这是它会去查找有没有正则匹配规则。

            location  /img/ {
                    echo " /img/";
            }
            location ~ /img/ {
                    echo "~ /img/";
            }
            location ~* /img/ {
                    echo "~* /img/";
            }
    #        location ^~ /img/ {
    #               echo "^~ /img/";
    #        }
    #       location = /img/ {
    #               echo "=  /img/";
    #       }
    
    其中,第一个和的第二个规则都是正则,这时会按照至上而下的顺序匹配。
    
    [root@www ~]# curl 192.168.0.116/img/
    ~ /img/
    
    

    第五步:其他的都注释后,因为优先匹配规则都没有找到,最后匹配到 /img/规则。

    [root@www ~]# curl 192.168.0.116/img/
     /img/
    

    这将是nginx系列文章,可关注同名微信公众号:笨办法学linux
    获取最近文章更新及精品软件,软件持续更新中。

    image.png

    相关文章

      网友评论

        本文标题:nginx入门详解(七)- 匹配规则

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