Nginx 正则匹配
匹配规则
| 匹配符号 | 匹配规则 |
|---|---|
= | 精确匹配(完全相等) |
^~ | 前缀匹配(停止正则检查) |
~ | 区分大小写的正则匹配 |
~* | 不区分大小写的正则匹配 |
!~ | 区分大小写的正则不匹配 |
!~* | 不区分大小写的正则不匹配 |
| 无符号 | 普通前缀匹配 |
匹配优先级顺序(从高到低)
=(精确匹配)^~(前缀匹配,停止正则检查)~或~*(正则匹配,按配置文件中的顺序检查)- 无符号(普通前缀匹配)
匹配示例
nginx
server {
# 1. 精确匹配(最高优先级)
location = /logo.png {
access_log off;
}
# 2. 前缀匹配(不检查后续正则)
location ^~ /static/ {
root /var/www/static;
}
# 3. 区分大小写的正则匹配
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
}
# 4. 不区分大小写的正则匹配
location ~* \.(jpg|png|gif)$ {
expires 7d;
}
# 5. 普通前缀匹配(最低优先级)
location / {
try_files $uri $uri/ /index.html;
}
}基本元字符
| 元字符 | 说明 | 示例 | 匹配示例 |
|---|---|---|---|
* | 匹配前一个字符 0次或多次 | lo*se | lse, lose, loose |
+ | 匹配前一个字符 1次或多次 | lo+se | lose, loose(不匹配 lse) |
? | 匹配前一个字符 0次或1次 | lo?se | lse, lose(不匹配 loose) |
. | 匹配 任意单个字符(除换行符) | a.c | abc, aac, a1c |
| `(a | b)` | 或匹配 a 或 b | `(jpg |
^ | 匹配 字符串开头 | ^/admin | /admin/login(不匹配 x/admin) |
$ | 匹配 字符串结尾 | \.php$ | index.php(不匹配 index.phpx) |
{n} | 精确匹配 n次 | a{3} | aaa(不匹配 aa 或 aaaa) |
{n,} | 匹配 至少n次 | a{2,} | aa, aaa(不匹配 a) |
{n,m} | 匹配 n到m次 | a{2,4} | aa, aaa, aaaa |
*? | 懒惰模式 尽可能少匹配 | a*?b | aaab → 匹配 aab(而非全部 aaab) |
+? | 懒惰模式 至少1次但尽可能少 | a+?b | aaab → 匹配 aab |
?? | 懒惰模式 0或1次但尽可能少 | a??b | aab → 匹配 ab |
{n,m}? | 懒惰模式 n到m次但尽可能少 | a{2,4}? | aaaa → 匹配 aa |
{n,}? | 懒惰模式 至少n次但尽可能少 | a{2,}? | aaaa → 匹配 aa |
关键区别
| 贪婪模式 | 懒惰模式 | 示例输入 | 匹配结果 |
|---|---|---|---|
a* | a*? | aaab | aaab vs aab |
a+ | a+? | aaab | aaab vs aab |
a{2,4} | a{2,4}? | aaaaa | aaaa vs aa |
实际应用示例
匹配图片扩展名(不区分大小写)
nginx
location ~* \.(jpg|png|gif)$ {
expires 30d;
}精确匹配首页
nginx
location = / {
proxy_pass http://homepage;
}懒惰模式提取最短路径
nginx
if ($uri ~ ^/user/(.*?)/profile$) {
# $1 会匹配最短内容(如 `/user/123/profile` → `123`)
}限制数字范围
nginx
location ~ ^/id/[0-9]{4,6}$ {
# 只匹配 4到6位数字的ID
}