Nginx-正则匹配

Nginx 中的正则匹配主要用于 location 块中,通过正则表达式匹配不同的 URL 路径,从而应用不同的配置规则。以下是 Nginx 正则匹配的核心用法和示例:

一、正则匹配的基本规则

  1. 符号含义
    • ~:区分大小写的正则匹配
    • ~*:不区分大小写的正则匹配
    • !~:区分大小写的正则不匹配
    • !~*:不区分大小写的正则不匹配
  1. 优先级

Nginx 会按以下顺序匹配 location:

    1. 精确匹配(location = /path)
    1. 前缀匹配(location /path,不带正则符号)
    1. 正则匹配(~ 或 ~* 开头的规则)
    1. 通用前缀匹配(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;  # 关闭日志
}

四、注意事项

  1. 正则匹配的贪婪性:正则默认是贪婪匹配(尽可能匹配最长字符串),如需非贪婪匹配,可在量词后加 ?(如 .*?)。
  1. 性能考量:复杂的正则匹配会消耗更多 CPU,建议优先使用精确匹配或前缀匹配,仅对必要场景使用正则。
  1. 测试工具 :可使用 nginx -t 检查正则语法是否正确,也可通过 curl 命令测试匹配效果(如 curl http://域名/path)。

通过灵活运用正则匹配,可以实现 URL 路由、资源过滤、权限控制等多种功能,是 Nginx 配置中非常强大的特性。

相关推荐
小灰灰的可爱无人可替代6 小时前
记录一次使用docker和docker-compose更新vue前端项目问题
nginx·docker·vue
会飞的鱼_1237 小时前
设备管理平台项目全流程部署指南:从环境到ELK日志监控
nginx
雲帝8 小时前
爱发电nginx转发企业微信webhook
nginx
星光一影15 小时前
【OA办公系统】神点企业OA办公助手/全开源
mysql·nginx·开源·php·源代码管理
matlab的学徒20 小时前
nginx+springboot+redis+mysql+elfk
linux·spring boot·redis·nginx
NicolasCage2 天前
解决苍穹外卖WebSocket连接失败的问题
nginx
维尔切2 天前
Nginx 反向代理与负载均衡
运维·nginx·负载均衡
Justin_193 天前
nginx反向代理与缓存功能
运维·nginx
苹果醋33 天前
数据结构其一 线性表
java·运维·spring boot·mysql·nginx
java干货3 天前
我用Nginx做了负载均衡,还需要API网关吗?
运维·nginx·负载均衡