nginx 正则表达式
Nginx是一个高性能的HTTP和反向代理服务器,常用于负载均衡、静态资源缓存和反向代理。Nginx使用正则表达式进行配置,让配置变得更加灵活方便。本文将探讨Nginx中如何使用正则表达式,以及在Nginx中如何正则匹配。
正则表达式语法
正则表达式是一种描述字符串模式的语法,通过模式匹配来搜索符合要求的字符串。在Nginx中使用的正则表达式语法与Perl兼容。以下是一些常用的正则表达式语法:
| 符号 | 描述 |
|---|---|
^ |
匹配字符串的开始位置 |
$ |
匹配字符串的结束位置 |
. |
匹配除了换行符之外的任意字符 |
* |
匹配0个或多个字符 |
+ |
匹配1个或多个字符 |
? |
匹配0个或1个字符 |
[] |
匹配符合括号中任意一个字符 |
() |
定义一个子表达式 |
基本用法示例
匹配目录URL:
location ~ /blog/(.+){
# 使用正则表达式获取子字符串,赋值给变量1
set category1;
# 根据子字符串生成对应的文件路径
# 如 /blog/php/test.html、/blog/python/test.html 等
try_files /blog/category/test.html /blog/category/index.html /blog/$category.html;
# 执行代理转发到后端服务器
proxy_pass http://backend;
}
上述例子中,使用正则表达式匹配以 /blog/ 开头的URL,并把匹配到的子字符串赋值给 $category 变量。根据 $category 变量的值生成对应的文件路径,并尝试查找该文件,若找到则返回文件内容,否则返回404错误。同时,将请求转发到后台服务器。
限定符
常用的限定符包括 *、+ 和 ?,用于限定前面的字符出现的次数:
| 限定符 | 描述 |
|---|---|
* |
匹配前面字符出现0或多次 |
+ |
匹配前面字符出现1或多次 |
? |
匹配前面字符出现0或1次 |
例如,匹配以 a 开头和以 b结尾之间出现1次或者多次 c的字符串:
location ~ ^/ac+?b$ {
try_files /test.html;
}
上述例子中,使用正则表达式匹配以 /a 开头和以 b 结尾之间出现1次或者多次 c的URL,并返回 /test.html 文件内容。
分组
在正则表达式中使用 () 来定义一个子表达式,方便后面的引用,例如:
location ~ ^/(blog|article)/(.+){
# 使用正则表达式获取第一个子字符串,赋值给变量1
set category1;
# 使用正则表达式获取第二个子字符串,赋值给变量 2
setarticle 2;
# 根据子字符串生成对应的文件路径
try_files /category/article.html /category/article/index.html /category/$article;
# 执行代理转发到后端服务器
proxy_pass http://backend;
}
上述例子中,使用正则表达式匹配以 /blog/ 或 /article/ 的URL,并把匹配到的子字符串分别赋值给 $category 和 $article 变量。根据 $category 和 $article 变量的值生成对应的文件路径,并尝试查找该文件,若找到则返回文件内容,否则返回404错误。同时,将请求转发到后台服务器。
零宽断言
零宽断言是一种特殊的正则表达式语法,用于约束正则表达式匹配的位置,但并不匹配实际的字符,这些断言分为肯定型零宽断言和否定型零宽断言。
| 零宽断言 | 描述 |
|---|---|
(?=pattern) |
肯定型零宽断言,匹配 pattern 前面的位置 |
(?<=pattern) |
肯定型零宽断言,匹配 pattern 后面的位置 |
(?!pattern) |
否定型零宽断言,匹配非 pattern 前面的位置 |
(?<!pattern) |
否定型零宽断言,匹配非 pattern 后面的位置 |
例如,匹配以 .jpg 结尾但不是以 thumb. 开头的URL:
location ~ ^/(?!thumb\.)[^/]+\.jpg$ {
try_files /test.jpg;
}
上述例子中,使用正则表达式匹配以 .jpg 结尾但不以 thumb. 开头的URL,并返回 /test.jpg 文件内容。
匹配特殊字符
正则表达式中有些字符有特殊的含义,如果需要匹配这些特殊字符,需要用反斜杠 \ 转义。以下是一些常见的特殊字符的转义方式:
| 特殊字符 | 转义方式 |
|---|---|
\ |
\\ |
( |
\( |
) |
\) |
. |
\. |
+ |
\+ |
| |
\| |
{ |
\{ |
} |
\} |
^ |
\^ |
$ |
\$ |
[ |
\[ |
] |
\] |
例如,匹配 URL 中包含 version= 参数并且值为 1.0.0 的字符串:
location ~ /download/(.+)\.(tar\.gz|zip)\?.*version=1\.0\.0.*{
try_files /download/1.$2;
}
上述例子中,使用正则表达式匹配以 /download/ 开头、以 .tar.gz 或 .zip 结尾、并且包含 version=1.0.0 参数的URL,并返回对应的文件内容。
结论
正则表达式是一个强大的工具,让Nginx的配置变得更加灵活。通过本文,你应该已经对Nginx中使用正则表达式有了一个初步的了解,可以在实际应用中使用正则表达式来匹配更加复杂的URL,实现精细化的配置和路由。
极客笔记