Next.js next.config.js正则路径匹配报错:Pattern cannot start with "?"
Next.js Headers正则匹配报错解决方案
你遇到的问题根源在于:Next.js的source字段并非支持完整的JavaScript正则语法——它基于path-to-regexp实现了一套简化的路由匹配规则,不支持反向预查((?!...))这类高级正则语法,所以直接把^(?!.*books).*$放在source里时,开头的?会被判定为非法起始字符,触发Pattern cannot start with "?"错误。
下面给你两种可行的解决办法:
方案一:用Condition字段过滤路径(推荐)
利用Next.js Headers配置中的condition字段,先匹配所有路径,再通过正则过滤掉包含books的路由,这样就能避开source的语法限制:
// next.config.js module.exports = { async headers() { return [ { // 匹配所有路由(包括根路径和子路径) source: '/:path*', // 排除包含"books"的路由 condition: { regex: '^(?!.*books).*$', locale: false // 若项目无需本地化路由,设为false避免干扰 }, headers: [ // 这里填写你的自定义Header配置 { key: 'X-Custom-Header', value: 'Non-books Route' } ] } ] } }
方案二:使用路径参数的正则匹配
直接在source的路径参数中嵌入path-to-regexp兼容的正则,拆分规则覆盖所有非books路由场景:
// next.config.js module.exports = { async headers() { return [ // 匹配根路径 { source: '/', headers: [{ key: 'X-Custom-Header', value: 'Non-books Route' }] }, // 匹配非books开头的一级路径及其子路径 { source: '/:segment(^(?!books).*)/:path*', headers: [{ key: 'X-Custom-Header', value: 'Non-books Route' }] } ] } }
这种方法需要拆分多个规则覆盖场景,不如方案一简洁。
测试时注意:condition中的正则会匹配完整请求路径(包含开头的/),像/about、/author/123这类路由会被匹配,/books、/store/books/456这类包含books的路由会被排除。
内容的提问来源于stack exchange,提问作者Shiraaz
相关产品推荐
相关产品推荐

