nginx 正则表达式

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

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程