nginx匹配规则详解

本文详细讲解了Nginx中location指令的语法、优先级、普通字符串和正则匹配规则,以及精确与模糊匹配的区别,通过实例演示了如何配置location来处理不同类型的URL请求。理解这些规则对于有效管理网站路由至关重要。
摘要由CSDN通过智能技术生成

一、介绍

location指令是http模块当中最核心的一项配置,根据预先定义的URL匹配规则来接收用户发送的请求,根据匹配结果,将请求转发到后台服务器、非法的请求直接拒绝并返回403、404、500错误处理等。本文结合语法、优先级、匹配规则做描述。

二、location指令语法

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

location 顺序/优先级:

(location =) > (location 完整路径) > (location ^~ 路径) > (location ~,~* 正则顺序) > (location 部分起始路径) > (/)

解释说明(下面会有详解):

= 开头表示精确匹配; 如: A 中只匹配根目录结尾的请求,后面不能带任何字符串.

^~ 开头表示uri以某个常规字符串开头,不是正则匹配;

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

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

/ 通用匹配, 如果没有其它匹配,任何请求都会匹配到;

三、URI匹配模式

location指令分为两种匹配模式:

1> 普通字符串匹配:以=开头或开头无引导字符(~)的规则

2> 正则匹配:以~或~*开头表示正则匹配,~*表示正则不区分大小写

四、location URI匹配规则

当nginx收到一个请求后,会截取请求的URI部份,去搜索所有location指令中定义的URI匹配模式。在server模块中可以定义多个location指令来匹配不同的url请求,多个不同location配置的URI匹配模式,总体的匹配原则是:先匹配普通字符串模式,再匹配正则模式。只识别URI部份,例如请求为:/test/abc/user.do?name=xxxx

一个请求过来后,Nginx匹配这个请求的流程如下:

1> 先查找是否有=开头的精确匹配,如:location = /test/abc/user.do { … }

2> 再查找普通匹配,以 最大前缀 为原则,如有以下两个location,则会匹配后一项

* location /test/ { … }

* location /test/abc { … }

3> 匹配到一个普通格式后,搜索并未结束,而是暂存当前匹配的结果,并继续搜索正则匹配模式

4> 所有正则匹配模式location中找到第一个匹配项后,就以此项为最终匹配结果

所以正则匹配项匹配规则,受定义的前后顺序影响,但普通匹配模式不会

5> 如果未找到正则匹配项,则以3中缓存的结果为最终匹配结果

6> 如果一个匹配都没搜索到,则返回404

五、精确匹配与模糊匹配差别

location =/ { … } 与 location / { … } 的差别:

* 前一个是精确匹配,只响应/请求,所有/xxx或/xxx/xxxx类的请求都不会以前缀的形式匹配到它

* 后一个是只要以 / 为前缀的请求都会被匹配到。如:/abc , /test/abc, /test/abc/aaaa

实际例子后缀区分:

假设nginx中的配置是:

server {
	listen 80;
	server_name x.x.x.x;
	......
	location /subdir {
		proxy_pass http://y.y.y.y;   ###注意这里没有以/结尾
	}

}

那么用户请求http://x.x.x.x/subdir/other时,匹配到该区块,nginx反代保留虚拟路径,nginx实际
转发后端的请求URL为http://http://x.x.x.x/subdir/other

假如配置为:

server {
	listen 80;
	server_name x.x.x.x;
	......
	location /subdir {
		proxy_pass http://y.y.y.y/;   ##注意这里以/结尾
	}

}

那么用户请求http://x.x.x.x/subdir/other时,匹配到该区块,nginx反代不会保留虚拟路径,nginx实际
转发后端的请求URL为http://http://x.x.x.x//other

六、正则与非正则匹配

1> location ~ /test/.+.jsp$ { … } :正则匹配,支持标准的正则表达式语法。

2> location ^~ / { … } : ^~意思是关闭正则匹配,当搜索到这个普通匹配模式后,将不再继续搜索正则匹配模式。

常用正则

  • . : 匹配除换行符以外的任意字符
  • ? : 重复0次或1次
  • + : 重复1次或更多次
  • * : 重复0次或更多次
  • \d :匹配数字
  • ^ : 匹配字符串的开始
  • $ : 匹配字符串的介绍
  • {n} : 重复n次
  • {n,} : 重复n次或更多次
  • [c] : 匹配单个字符c
  • [^/] : 匹配除了/之外的所有字符
  • [a-z] : 匹配a-z小写字母的任意一个

下面看一些实际例子:

location  = / {
  # 精确匹配 / ,主机名后面不能带任何字符串
  [ configuration A ]
}
location  / {
  # 因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求
  # 但是正则和最长字符串会优先匹配
  [ configuration B ]
}
location /documents/ {
  # 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索
  # 只有后面的正则表达式没有匹配到时,这一条才会采用这一条
  [ configuration C ]
}
location ~ /documents/Abc {
  # 匹配任何以 /documents/Abc 开头的地址,匹配符合以后,还要继续往下搜索
  # 只有后面的正则表达式没有匹配到时,这一条才会采用这一条
  [ configuration CC ]
}
location ^~ /images/ {
  # 匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条。
  [ configuration D ]
}
location ~* \.(gif|jpg|jpeg)$ {
  # 匹配所有以 gif,jpg或jpeg 结尾的请求
  # 然而,所有请求 /images/ 下的图片会被 config D 处理,因为 ^~ 到达不了这一条正则
  [ configuration E ]
}
location /images/ {
  # 字符匹配到 /images/,继续往下,会发现 ^~ 存在
  [ configuration F ]
}
location /images/abc {
  # 最长字符匹配到 /images/abc,继续往下,会发现 ^~ 存在
  # F与G的放置顺序是没有关系的
  [ configuration G ]
}
location ~ /images/abc/ {
  # 只有去掉 config D 才有效:先最长匹配 config G 开头的地址,继续往下搜索,匹配到这一条正则,采用
    [ configuration H ]
}
location ~* /js/.*/\.js {
  # 不区分大小写匹配
  [ configuration I ]
}

  • 10
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半生痴狂半生颠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值