NextJS 13+ 子域名重写问题:archives子域名二级页面404
问题原因与修复方案
核心错误点
- Host匹配规则错误:你在
has数组中给host类型的value设置了archives.localhost/:path*,但host匹配仅针对域名部分,不需要包含路径,路径由source字段处理,这个错误导致带路径的请求(比如archives.localhost:3000/test)无法触发预期的重写规则。 - 路径正则匹配冗余:原
source的正则表达式/:path((?!api|auth|_next).)*写法冗余,且因为host规则失效,带路径的请求会直接走fallback规则,导致请求被映射到原路径而非/archives下的对应页面,最终出现404。
修复后的配置代码
/** @type {import('next').NextConfig} */ const nextConfig = { experimental: { missingSuspenseWithCSRBailout: false, }, async rewrites() { return { beforeFiles: [ // 将 archives.localhost 域名下的请求重写到 /archives 路径 { source: '/:path*', has: [ { type: 'host', value: 'archives.localhost', }, ], destination: '/archives/:path*', }, // 保留默认 fallback 规则 { source: '/:path*', destination: '/:path*', } ] } } } export default nextConfig;
修复说明
- 修正Host匹配:将host的
value改为纯域名archives.localhost,确保所有来自该域名的请求都能触发重写规则。 - 简化source规则:直接使用
/:path*匹配域名下所有路径,Next.js内部的api、auth、_next等路径会自动跳过该重写,无需额外排除。 - 重写逻辑生效:现在访问
archives.localhost:3000/会被重写到/archives/,访问archives.localhost:3000/test会被正确映射到/archives/test,对应页面就能正常加载。
内容的提问来源于stack exchange,提问作者Logan Rios
相关产品推荐
相关产品推荐

