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,实现精细化的配置和路由。