前提:想如何使用rewrite,首先我们得了解什么是正则表达式、location,然后再去使用
Nginx正则匹配
正则表达式
概述
- 和shell的正则表达式类似,又所不同
- 复杂的路径匹配需要使用正则表达式表示,正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串
- 在很多文本编辑器中,正则表达式通常被用来检索、替换符合某个模式的文本
- 许多程序设计语言都支持利用正则表达式进行字符串操作
常用的的正则表达式符号
符号 | 描述 |
---|---|
^ | 匹配输入字符申的起始位置 |
$ | 匹配输入字符串的结束位置 |
* | 匹配前面的字符零次或多次 |
+ | 匹配前面的字符一次或多次 |
? | 匹配前面的字符零次或一次 |
. | 匹配除"\n"之外的任何单个字符 |
\ | 将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用 |
\d | 匹配纯数字 |
{n} | 重复n次 |
{n,} | 重复n次或更多次 |
{n,m} | 重复n到m次 |
[] | 定义匹配的字符范围 |
[c] | 匹配单个字符 |
[a-z] | 匹配a-z小写字母的任意一个 |
[a-zA-Z0-9] | 匹配所有大小写字母或数字 |
() | 表达式的开始和结束位置 |
| | 或运算符 |
ps:注意每个的用法
location
大致分三类
- 精准匹配:location = / {…}
- 一般匹配:location / {…}
- 正则匹配:location ~ / {…}
常用匹配规则
符号 | 描述 |
---|---|
= | 进行普通字符精准匹配,也就是完全匹配 |
^~ | 表示普通字符匹配,使用前缀匹配;如果匹配成功,则不再匹配后续location |
~ | 区分大小写的匹配 |
~* | 不区分大小写的匹配 |
!~ | 区分大小写的匹配取非 |
!~* | 不区分大小写的匹配取非 |
优先级
- 1.首先精准匹配 =
- 2.其次前缀匹配 ^~
- 3.其次是按文件中顺序的正则匹配 ~ 或 ~*
- 4.然后是匹配不带任何修饰的前缀匹配,即一般匹配
- 5.最后交给 / 通用匹配,优先级最低
ps:文件在
示例
1
localtion = / {}
=为精准匹配 /,主机名后面不能带任何字符串,比如访问 / 和 /duan,则 / 匹配,/duan 不匹配
或
location = /abc,则只匹配/abc,/abc/或者/abcd不匹配。若location /abc,则即匹配/abc./abcd/和/abc/
2
plocation / {}
因为所有的地址都以 / 开头,所以这条规则将匹配到所有的请求,比如访问 / 和 /data,则 / 匹配,/data也匹配
但若后面是正则表达式,则会和最长字符串优先匹配(最长匹配)
3
location /documents/ {}
匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索其它 location
4
location /documents/abc {}
匹配任何以 /documents/abc 开头的地址,匹配符合后,还要继续往下搜索其他 location
只有其他 location 后面的正则表达式没有匹配到时,才会采用这一条
5
location ^~ /images/ {}
匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,并采用这条
6
location ~* .(gif|jpg|jpeg)$ {}
匹配所有以 gif、jpg、jpeg 为结尾的请求
然而,所有请求 /images/ 下的图片会被 location ^~ /images/ 处理,因为 ^~ 的优先级更高,所以到达不了这一条正则
7
location /images/abc {}
最长字符匹配到 /images/abc,优先级最低,继续往下搜索其它 location,会发现 ^~ 和 ~ 存在
8
location ~ /images/abc {}
匹配以 /images/abc 开头的,优先级次之,只有去掉 location ^~ /images 才会采用这一条
9
location /images/abc/1.html {}
匹配 /images/abc/1.html 文件,如果和正则 ~ /images/abc/1.html 相比,正则优先级更高
10
优先级总结:
(location = 完整路径) > (location ^~ 路径) > (location ,* 正则顺序) > (location 部分起始路径) > (location /)