You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Next.js 12.2中间件Matcher正则问题:仅匹配含大写字母URL

解决Next.js 12.2中间件仅在URL含大写字母时触发的正则问题

问题根源

你之前的matcher正则未正确组合「排除特定前缀」与「匹配大写字母」的逻辑,导致所有非排除前缀的请求(无论是否含大写)都会触发中间件。要解决这个问题,需构造一个同时满足两个条件的正则:排除指定前缀且路径包含至少一个大写字母。

正确的Matcher配置

在middleware.ts中使用以下配置,确保中间件仅对符合条件的请求触发:

import { NextResponse } from 'next/server'
import type { NextRequest } from 'next/server'

export function middleware(request: NextRequest) {
  // 转换URL为全小写并执行永久重定向
  const lowercaseUrl = new URL(request.url.toLowerCase())
  return NextResponse.redirect(lowercaseUrl, { status: 301 })
}

export const config = {
  matcher: [
    // 正则规则:排除指定前缀 + 包含大写字母
    '^/(?!api/|_next/static/|_next/image/|favicon\\.ico).*[A-Z].*$'
  ],
}

正则规则拆解

逐个解析正则的关键部分:

  • ^/:匹配URL路径的起始斜杠,确保从根路径开始匹配
  • (?!api/|_next/static/|_next/image/|favicon\.ico):负向前瞻断言,直接排除以下前缀的请求:
    • /api/:API路由
    • /_next/static/:Next.js静态资源
    • /_next/image/:Next.js图片优化路由
    • favicon.ico:站点图标(可根据业务需求增减排除项)
  • .*[A-Z].*:匹配路径中至少包含一个大写字母的任意内容,确保只有带大写的URL才会触发中间件
  • $:匹配路径结尾,避免部分匹配导致的误触发

验证逻辑

  • 触发中间件的URL示例:/AboutUs、/product/ITEM123、/Blog/Post
  • 不触发中间件的URL示例:/aboutus、/api/user/1、/_next/static/css/main.css、/favicon.ico

注意事项

  1. Next.js v12.2的matcher正则需严格遵循语法,特殊字符(如.)需转义为\.
  2. 本地开发环境可直接验证,确保全小写的非排除URL不会触发中间件
  3. 使用301永久重定向,帮助搜索引擎更新URL规范

内容的提问来源于stack exchange,提问作者Richard Weaver

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 07:53:27