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
注意事项
- Next.js v12.2的matcher正则需严格遵循语法,特殊字符(如
.)需转义为\. - 本地开发环境可直接验证,确保全小写的非排除URL不会触发中间件
- 使用301永久重定向,帮助搜索引擎更新URL规范
内容的提问来源于stack exchange,提问作者Richard Weaver
相关产品推荐
相关产品推荐

