Next.js中间件匹配器排除首页失效问题求助
Next.js中间件排除根路径校验的解决方案
你的问题出在正则匹配的逻辑上,原写法的负向预查没有正确覆盖根路径的情况。以下是两种可行的解决办法:
方法一:使用Next.js匹配器的排除语法(推荐)
这种写法更直观,不容易出错,直接用!前缀指定要排除的路径:
export const config = { matcher: [ // 先匹配所有路径 "/:path*", // 排除不需要校验的路径 "!/", "!/_next/static/:path*", "!/_next/image/:path*", "!/favicon.ico", "!/.*\\.(?:svg|png|jpg|jpeg|gif|webp)$", ], };
方法二:修正原正则表达式
如果坚持用单个正则,需要调整负向预查的位置,让它能匹配到根路径的情况:
export const config = { matcher: [ /* * Match all request paths except for: * - Root path (/) * - _next/static (static files) * - _next/image (image optimization files) * - favicon.ico (favicon file) * - Image files (svg, png, jpg, etc.) */ "/((?!$|_next/static|_next/image|favicon.ico|.*\\.(?:svg|png|jpg|jpeg|gif|webp)$).*)", ], };
这里去掉了^,因为当路径是/时,/后面的内容是空字符串,(?!$)就能匹配到这种情况,从而排除根路径的校验。
为什么原写法无效?
原正则里的^$|^/$是针对整个请求路径的,但你的正则结构是/((?!...).*),(?!...)只检查/后面的内容,而根路径/的/后面是空,^$在这里匹配的是整个字符串的开头结尾,不是/后面的部分,所以无法生效。
内容的提问来源于stack exchange,提问作者CyberJ
相关产品推荐
相关产品推荐

