跳到主要内容

Nginx 正则表达式

在 Nginx 中,正则表达式(Regular Expressions,简称 regex)是一种强大的工具,用于匹配和重写 URL。通过正则表达式,你可以灵活地定义复杂的匹配规则,从而实现 URL 重定向、路径重写等功能。本文将详细介绍 Nginx 正则表达式的基础知识、语法规则以及实际应用。

什么是正则表达式?

正则表达式是一种用于匹配字符串的模式。它由一系列字符和特殊符号组成,可以用来检查一个字符串是否符合某种模式,或者从字符串中提取特定的部分。在 Nginx 中,正则表达式通常用于 location 块和 rewrite 指令中,以实现 URL 的匹配和重写。

Nginx 正则表达式基础

1. 基本语法

Nginx 支持两种类型的正则表达式:

  • 普通正则表达式:以 ~ 开头,区分大小写。
  • 不区分大小写的正则表达式:以 ~* 开头,不区分大小写。

例如:

nginx
location ~ \.php$ {
# 匹配以 .php 结尾的 URL,区分大小写
}

location ~* \.php$ {
# 匹配以 .php 结尾的 URL,不区分大小写
}

2. 常用元字符

以下是一些常用的正则表达式元字符及其含义:

  • .:匹配任意单个字符(除了换行符)。
  • *:匹配前面的字符零次或多次。
  • +:匹配前面的字符一次或多次。
  • ?:匹配前面的字符零次或一次。
  • ^:匹配字符串的开头。
  • $:匹配字符串的结尾。
  • \d:匹配数字字符(等价于 [0-9])。
  • \w:匹配字母、数字或下划线(等价于 [a-zA-Z0-9_])。
  • []:匹配括号内的任意一个字符。
  • ():捕获组,用于提取匹配的部分。

3. 捕获组与反向引用

在正则表达式中,() 用于创建捕获组。捕获组可以提取匹配的部分,并在后续的规则中使用。例如:

nginx
location ~ ^/user/(\d+)$ {
# 匹配 /user/123 这样的 URL,并捕获数字部分
rewrite ^/user/(\d+)$ /profile?id=$1 last;
}

在这个例子中,(\d+) 捕获了 URL 中的数字部分,并通过 $1rewrite 指令中引用。

实际案例

案例 1:重写 URL 路径

假设你有一个网站,希望将所有以 /old/ 开头的 URL 重定向到 /new/ 路径。可以使用以下配置:

nginx
location ~ ^/old/(.*)$ {
rewrite ^/old/(.*)$ /new/$1 permanent;
}
  • 输入/old/page1
  • 输出/new/page1

案例 2:动态 URL 重写

假设你有一个动态生成的 URL,格式为 /product/123,其中 123 是产品 ID。你希望将其重写为 /product?id=123

nginx
location ~ ^/product/(\d+)$ {
rewrite ^/product/(\d+)$ /product?id=$1 last;
}
  • 输入/product/123
  • 输出/product?id=123

案例 3:处理文件扩展名

假设你希望将所有 .html 文件重定向到对应的 .php 文件:

nginx
location ~* \.html$ {
rewrite ^(.*)\.html$ $1.php last;
}
  • 输入/page.html
  • 输出/page.php

总结

Nginx 正则表达式是处理 URL 重写和匹配的强大工具。通过掌握正则表达式的基本语法和常用元字符,你可以灵活地定义复杂的匹配规则,从而实现各种 URL 处理需求。本文介绍了正则表达式的基础知识、捕获组的使用以及实际应用案例,希望能帮助你更好地理解和应用 Nginx 正则表达式。

附加资源与练习

  • 练习 1:尝试编写一个 Nginx 配置,将所有以 /blog/ 开头的 URL 重定向到 /articles/ 路径。
  • 练习 2:编写一个正则表达式,匹配所有以 .jpg.png 结尾的图片文件,并将它们重定向到一个统一的图片处理脚本 /image-processor
提示

如果你对正则表达式还不熟悉,建议先学习一些基础的正则表达式教程,这将帮助你更好地理解 Nginx 中的正则表达式应用。