0°

Nginx Location正则匹配及优先级讲解

在一个server中location配置段可存在多个,用于实现从url到文件系统的路径映射;nginx会根据用户请求的uri来检查定义的所有location,并找出一个最佳匹配,而后应用其配置。

官方文档地址:http://nginx.org/en/docs/http/ngx_http_core_module.html#location

基本语法如下:

location [ = | ~ | ~* | ~ ] uri { … }
=:对URI的右半部分做精确匹配,区分字符大小写;
~:对URI的左半部分做匹配检查,不区分字符大小写;
~:对URI做正则表达式模式匹配,区分字符大小写;
~*:对URI做正则表达式模式匹配,不区分字符大小写;

1.location 语法如下

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

2.官方示例

#精确匹配(区分字符大小写)
location = / {
    [ configuration A ]
}

#通用匹配
location / {
    [ configuration B ]
}

#路径匹配
location /documents/ {
    [ configuration C ]
}

#左侧开头匹配(^~ 不区分大小写)
location ^~ /images/ {
    [ configuration D ]
}

#右侧结尾匹配(~* 不区分大小写)
location ~* \.(gif|jpg|jpeg)$ {
    [ configuration E ]
}

假如上面location的域名是 k8sops.cn,那么访问如下几种情况会匹配到哪个location?

  1. 访问地址 https://k8sops.cn/ (地址匹配 A 和 B,但是会访问到 A 上,因为精确匹配优先级最高)
  2. 访问地址 https://k8sops.cn/index.html (地址只匹配B,所以访问到B上)
  3. 访问地址 https://k8sops.cn/documents/document.html (地址匹配 B 和 C,因为C的匹配长度和相似度最高,所以匹配到C上)
  4. 访问地址 https://k8sops.cn/images/1.gif (地址匹配 B|D|E,最后会被匹配到 D 上,因为 ~ 的优先级仅次于 = 号)
  5. 访问地址 https://k8sops.cn/documents/1.jpg (地址匹配 B C E,最后会陪匹配到 E 上,因为 ~* 优先级要高于 /)

location在一次访问中只会使用一次,访问请求进来后会根据location优先级检查匹配,优先级最高的获得请求匹配。

Location 案例

1.通用及路径匹配

server {
        listen       80;
        server_name k8sops.cn;

#通用匹配
        location / {
            return 400;
        }

#路径匹配
        location /k8sops {
            return 401;
        }

#精确匹配
        location = /abcops {
            return 402;
        }

#正则匹配区分大小写
        location ~ /docker {
            return 403;
        }
}

2.以xx开头或以xx结尾

server {
        listen       80;
        server_name k8sops.cn;

#以kubernetes开头区分大小写
#访问地址: http://k8sops.cn/kubernetes
        location ^~ /kubernetes {
            return 401;
        }

#以.php结尾区分大小写
#访问地址:http://k8sops.cn/index.php
        location ~ \.php$ {
            root /data/nginx/html;
            index index.php;
        }

#以.jps结尾区分大小写
#访问地址:http://k8sops.cn/index.jsp
        location ~ \.jsp$ {
            root /data/nginx/html;
            index index.jsp;
        }

#以多个.xxx结尾区分大小写
#访问地址:http://k8sops.cn/image.(gif|png|jpg|jpeg|svg|ico)
        location ~ \.(gif|png|jpg|jpeg|svg|ico)$ {
             root /data/nginx/html;
        }
}

Location优先级

多个location优先级,匹配优先级顺序:=, ~, ~/~*,不带符号;

1.根路径匹配优先级比较
访问地址: http://k8sops.cn/kubernetes

server {
        listen       80;
        server_name k8sops.cn;

        location / {                                优先级最低
            return 401;
        }

        location /kubernetes {                      优先级中等
            return 402;
        }

        location ~ ^/kubernetes {                   优先级最高
            return 403;
        }
}

2.正则优先级匹配
访问地址:http://k8sops.cn/kubernetes/devops

server {
        listen       80;
        server_name k8sops.cn;

#优先级最低
        location / {
            return 401;
        }

#优先级最高,nginx按照顺序从上往下匹配, 路径到这里匹配成功后就会再往下面匹配
        location ~ /kubernetes {                    
            return 402;
        }

#优先级同第二个location,因为位置在第二个location下面,所以在第二个location匹配成功后,就不会在匹配此location
        location ~ ^/kubernetes {                   
            return 403;
        }

#优先级与上面两个一样高,只是此location位置在下面,上面的location匹配成功后,就不会在往下匹配
        location ~ ^/kubernetes/devops {            
            return 405;
        }
}

3.正则与精准匹配
访问地址:http://k8sops.cn/kubernetes
访问地址:http://k8sops.cn/kubernetes/devops

server {
        listen       80;
        server_name k8sops.cn;

        location ~ ^/kubernetes/devops {
            return 401;
        }

        location ~ /kubernetes {
            return 402;
        }

        location ~ ^/kubernetes {
            return 403;
        }

#访问地址为 http://k8sops.cn/kubernetes 时,此location优先级最高
        location = /kubernetes {            
            return 405;
        }

#访问地址为 http://k8sops.cn/kubernetes/devops 时,此location优先级最高
        location = /kubernetes/devops {
            return 406;
        }
}

优先级结论

  1. 精准匹配 —> 正则匹配 —> 通用匹配
  2. 正则多次命中,选择第一个命中的location,后面不在匹配
  3. 通用多个命中,选择匹配度最高的location






「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论