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

相关推荐
就叫飞六吧1 天前
Nginx 主要的几种负载均衡模式
运维·nginx·负载均衡
脚踏实地的大梦想家2 天前
【Docker】P2 Docker 命令:从Nginx部署到镜像分享的全流程指南
java·nginx·docker
苹果醋33 天前
element-ui源码阅读-样式
java·运维·spring boot·mysql·nginx
向上的车轮3 天前
Actix Web 不是 Nginx:解析 Rust 应用服务器与传统 Web 服务器的本质区别
前端·nginx·rust·tomcat·appche
摇滚侠4 天前
Nginx 与 F5 负载均衡的区别
nginx·负载均衡
huangql5205 天前
Nginx 从零到精通 - 最详细的循序渐进教程
开发语言·网络·nginx
苦逼IT运维5 天前
Kubernetes 双层 Nginx 容器环境下的 CORS 问题及解决方案(极端情况)
运维·nginx·容器·kubernetes·jenkins·运维开发·ci
cqwuliu5 天前
通过nginx+openssl自签名证书部署https应用并解决不安全问题
nginx·安全·https
my一阁6 天前
tomcat web实测
java·前端·nginx·tomcat·负载均衡
念念不忘 必有回响6 天前
Nginx前端配置与服务器部署详解
服务器·前端·nginx