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 配置中非常强大的特性。

相关推荐
杨了个杨89823 小时前
Keepalived + Nginx + HAProxy 高可用架构部署实战案例
java·nginx·架构
李白的天不白14 小时前
服务器地址在哪里 pwd
运维·前端·nginx
snow@li14 小时前
nginx:详解与速查表 / Nginx = 反向代理 + 负载均衡 + 静态服务器 + HTTP 缓存 / 请求分发、静态加速、上线不中断
linux·服务器·nginx
前端程序猿i1 天前
Nginx 教程:从入门到能上线
运维·nginx
明辰之林1 天前
Nginx 1.26.2 → 1.30.2 升级指南(离线环境)
nginx
小云小白1 天前
企业抗量子落地指南(一)全链路抗量子 TLS1.3 落地指南(浏览器 → Nginx → SpringBoot)
spring boot·nginx·抗量子通信
tobias.b1 天前
JumpServer4\.10\.16离线部署\+外部Nginx反向代理 解决30分钟空闲断开WebSocket超时(延长10天)
运维·websocket·nginx
衫水1 天前
Windows Server Nginx 代理企业内网 API 偶发超时处理与保活 SOP(20260608))
运维·windows·nginx
是一个Bug2 天前
Nginx 与 API Gateway:从“小区门卫”到“商场总服务台”
运维·nginx·gateway
锋行天下3 天前
中小项目高可用,真的需要K8s吗?从单机备份到企业级架构的完整思考
后端·mysql·nginx