Nginx功能-路由功能

本文介绍了Nginx的location匹配语法,包括精准匹配、普通匹配(区分大小写和不区分大小写)以及正则表达式匹配。在Nginx中,匹配顺序为精准匹配>普通匹配>正则表达式,但实际选择会考虑最长匹配和正则覆盖。通过多个实例解析了location的路由配置逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Nginx的路由功能实现由location来完成,根据location匹配的路径执行内部指令。

location对url的匹配语法:

location [=|~|~*|^~] /uri/ { … }

1、=:表示精准匹配

2、普通匹配

      2.1 、~:区分大小写

      2.2、~*:不区分大小写

      2.3^~:非正则表达式匹配

3、\$:正则表达式

其中优先级为精准匹配>普通匹配>正则表达式。但是最终使用哪个路径不是简简单单的优先级就决定了。下面会根据实例慢慢分析。

1、标准匹配,如果都能匹配到,则nginx会选择最长匹配返回。而且精准匹配不会被其他普通匹配或者正则表达式覆盖。

location = /equal/a {
                echo '/equal/a';
        }

        location = /equal/a/b {
                echo '/equal/a/b';
        }

        location = /equal/a/b/c {
                echo '/equal/a/b/c';
        }

curl http://water.com/equal/a/b则会输出 /equal/a/b

curl http://water.com/equal/a/b/c则会输出 /equal/a/b/c

2、普通匹配,如果都能匹配到,则nginx会选择最长匹配返回。与精准匹配类似,但是普通匹配有可能被正则表达式覆盖。

 location /match/a{#命中,当不是最长
                echo '/match/a';
        }
        location /match/a/b {#命中,当不是最长
                echo '/match/a/b';
        }

        location /match/a/b/c {#命中,是最长
                echo '/match/a/b/c';
        }

        location /match/a/b/c/d {#命中,当不是最长
                echo '/match/a/b/c/d';
        }

普通匹配(非正则表达式)不会被正则表达式,因为普通匹配的的非正则表达式已经声明不使用正则表达式,所以不不会被正则覆盖。
        location ^~ /re/a/b{#普通匹配-非正则匹配,访问/re/a/b开头的路径,不会被后面的正则覆盖
                echo 'match ^~ /re/a/b*';
        }


       location /re/a.html{#普通匹配,访问/re/a.html,会被后面的正则覆盖
                echo 'match /re/a.html';
        }


       location ~ /rex/a/(.*)\.(html|js|css)$ {#正则表达式,覆盖/re/a.html路径,但是不会覆盖 ^~ /re/a/b
                echo 'match second';
        }

3、正则表达式,如果出现多个正则表达式匹配,则以出现的顺序为准

 #正则匹配,括号里变量替换$1,$2
        location ~ /re/(.*)\.(html|js|css)$ {#覆盖/re/a.html路径
                echo 'cover /re/$1.$2';
        }

        #正则表达式匹配,以出现顺序为准
        location ~ /rex/(.*)\.(html|js|css)$ {#覆盖/re/a.html路径
                echo 'match first';
        }

        location ~ /rex/a/(.*)\.(html|js|css)$ {#覆盖/re/a.html路径
                echo 'match second';
        }

        location ~ /rex/a/b/(.*)\.(html|js|css)$ {#覆盖/re/a.html路径
                echo 'match third';

        }
由此我们发现,基本优先级是精准匹配>普通匹配>正则表达式,但是不是绝对的,因为普通匹配又是有可能被正则表达式覆盖的。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值