Nginx 中的正则匹配主要用于 location 块中,通过正则表达式匹配不同的 URL 路径,从而应用不同的配置规则。以下是 Nginx 正则匹配的核心用法和示例:
一、正则匹配的基本规则
- 符号含义
-
- ~:区分大小写的正则匹配
-
- ~*:不区分大小写的正则匹配
-
- !~:区分大小写的正则不匹配
-
- !~*:不区分大小写的正则不匹配
- 优先级
Nginx 会按以下顺序匹配 location:
-
- 精确匹配(location = /path)
-
- 前缀匹配(location /path,不带正则符号)
-
- 正则匹配(~ 或 ~* 开头的规则)
-
- 通用前缀匹配(location /)
二、常用正则表达式语法
符号 | 含义 | 示例 |
---|---|---|
. | 匹配任意单个字符(除换行符) | a.b 匹配 aab、acb 等 |
* | 匹配前一个字符 0 次或多次 | ab* 匹配 a、ab、abb |
+ | 匹配前一个字符 1 次或多次 | ab+ 匹配 ab、abb 等 |
? | 匹配前一个字符 0 次或 1 次 | ab? 匹配 a 或 ab |
? | 匹配字符串开头 | ^/api 匹配以 /api 开头的路径 |
$ | 匹配字符串结尾 | .html$ 匹配以 .html 结尾的路径 |
() | 分组捕获 | (\d+) 匹配数字并捕获 |
` | ` | 逻辑或 |
[] | 匹配括号内的任意单个字符 | [0-9] 匹配任意数字 |
[^] | 匹配不在括号内的任意单个字符 | [^a-z] 匹配非小写字母 |
\d | 匹配数字(等价于 [0-9]) | \d{2} 匹配 2 位数字 |
\w | 匹配字母、数字或下划线(等价于 [a-zA-Z0-9_]) | \w+ 匹配单词 |
三、实际配置示例
1. 匹配静态资源(图片、CSS、JS)
csharp
# 不区分大小写匹配常见静态资源后缀,应用缓存配置
location ~* .(jpg|jpeg|png|gif|css|js|ico)$ {
root /var/www/static;
expires 30d; # 缓存30天
}
2. 匹配 API 路径并代理到后端服务
perl
# 区分大小写匹配以 /api/ 开头的路径,代理到后端接口服务
location ~ ^/api/ {
proxy_pass http://127.0.0.1:8080; # 后端服务地址
proxy_set_header Host $host;
}
3. 禁止访问特定文件或目录
bash
# 匹配以 .git 或 .env 开头的文件/目录,拒绝访问
location ~ /.git/ | /.env$ {
deny all; # 禁止访问
return 403;
}
4. 匹配 URL 中的数字 ID 并处理
bash
# 匹配 /user/数字 的路径(如 /user/123)
location ~ ^/user/(\d+)$ {
# 使用捕获的数字($1 表示第一个分组)
proxy_pass http://127.0.0.1:8080/user?id=$1;
}
5. 不匹配特定路径(反向匹配)
ruby
# 不匹配 .html 结尾的路径(即非 HTML 文件)
location ~ !*.html$ {
access_log off; # 关闭日志
}
四、注意事项
- 正则匹配的贪婪性:正则默认是贪婪匹配(尽可能匹配最长字符串),如需非贪婪匹配,可在量词后加 ?(如 .*?)。
- 性能考量:复杂的正则匹配会消耗更多 CPU,建议优先使用精确匹配或前缀匹配,仅对必要场景使用正则。
- 测试工具 :可使用 nginx -t 检查正则语法是否正确,也可通过 curl 命令测试匹配效果(如 curl http://域名/path)。
通过灵活运用正则匹配,可以实现 URL 路由、资源过滤、权限控制等多种功能,是 Nginx 配置中非常强大的特性。