Skip to content

Nginx 正则匹配

匹配规则

匹配符号匹配规则
=精确匹配(完全相等)
^~前缀匹配(停止正则检查)
~区分大小写的正则匹配
~*不区分大小写的正则匹配
!~区分大小写的正则不匹配
!~*不区分大小写的正则不匹配
无符号普通前缀匹配

匹配优先级顺序(从高到低)

  1. =(精确匹配)
  2. ^~(前缀匹配,停止正则检查)
  3. ~~*(正则匹配,按配置文件中的顺序检查)
  4. 无符号(普通前缀匹配)

匹配示例

nginx
server {
    # 1. 精确匹配(最高优先级)
    location = /logo.png {
        access_log off;
    }

    # 2. 前缀匹配(不检查后续正则)
    location ^~ /static/ {
        root /var/www/static;
    }

    # 3. 区分大小写的正则匹配
    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
    }

    # 4. 不区分大小写的正则匹配
    location ~* \.(jpg|png|gif)$ {
        expires 7d;
    }

    # 5. 普通前缀匹配(最低优先级)
    location / {
        try_files $uri $uri/ /index.html;
    }
}

基本元字符

元字符说明示例匹配示例
*匹配前一个字符 0次或多次lo*selse, lose, loose
+匹配前一个字符 1次或多次lo+selose, loose(不匹配 lse
?匹配前一个字符 0次或1次lo?selse, lose(不匹配 loose
.匹配 任意单个字符(除换行符)a.cabc, aac, a1c
`(ab)`或匹配 a 或 b`(jpg
^匹配 字符串开头^/admin/admin/login(不匹配 x/admin
$匹配 字符串结尾\.php$index.php(不匹配 index.phpx
{n}精确匹配 n次a{3}aaa(不匹配 aaaaaa
{n,}匹配 至少n次a{2,}aa, aaa(不匹配 a
{n,m}匹配 n到m次a{2,4}aa, aaa, aaaa
*?懒惰模式 尽可能少匹配a*?baaab → 匹配 aab(而非全部 aaab
+?懒惰模式 至少1次但尽可能少a+?baaab → 匹配 aab
??懒惰模式 0或1次但尽可能少a??baab → 匹配 ab
{n,m}?懒惰模式 n到m次但尽可能少a{2,4}?aaaa → 匹配 aa
{n,}?懒惰模式 至少n次但尽可能少a{2,}?aaaa → 匹配 aa

关键区别

贪婪模式懒惰模式示例输入匹配结果
a*a*?aaabaaab vs aab
a+a+?aaabaaab vs aab
a{2,4}a{2,4}?aaaaaaaaa vs aa

实际应用示例

匹配图片扩展名(不区分大小写)

nginx
location ~* \.(jpg|png|gif)$ {
    expires 30d;
}

精确匹配首页

nginx
location = / {
    proxy_pass http://homepage;
}

懒惰模式提取最短路径

nginx
if ($uri ~ ^/user/(.*?)/profile$) {
    # $1 会匹配最短内容(如 `/user/123/profile` → `123`)
}

限制数字范围

nginx
location ~ ^/id/[0-9]{4,6}$ {
    # 只匹配 4到6位数字的ID
}