Next.js i18n多域名共享同一语言子路径路由配置问题
解决方案
Next.js 内置 i18n 的域名路由模式确实存在「单个 locale 只能绑定唯一域名」的强制校验,要实现多域名共享同一英文语言的需求,有以下三种可直接落地的方案:
方案1:用中间件重写路由,绕过内置规则限制
改动最小,不需要调整现有业务逻辑:
- 首先在
next.config.js中仅给每个域名配置本土默认 locale,不要把en添加到多域名的 locales 列表中,全局 locales 保留所有需要用到的语言标识即可
配置示例:// next.config.js module.exports = { i18n: { locales: ['de', 'fr', 'nl', 'en', 'en-US', 'en-GB'], defaultLocale: 'en', domains: [ { domain: 'sitename.com', defaultLocale: 'en-US' }, { domain: 'sitename.co.uk', defaultLocale: 'en-GB' }, { domain: 'sitename.de', defaultLocale: 'de' }, { domain: 'sitename.fr', defaultLocale: 'fr' }, { domain: 'sitename.nl', defaultLocale: 'nl' }, ] } } - 在项目根目录新增
middleware.js,匹配所有非英美域名下的/en路径请求,直接重写为对应enlocale 的内容,不会触发内置 i18n 的绑定校验
代码示例:// middleware.js import { NextResponse } from 'next/server' export function middleware(request) { const { pathname, host } = request.nextUrl // 匹配德/法/荷域名下的/en路径 if (pathname.startsWith('/en') && !['sitename.com', 'sitename.co.uk'].includes(host)) { return NextResponse.rewrite(new URL(`/en${pathname.slice(3)}`, request.url)) } } export const config = { matcher: '/:path*', } - 页面内直接通过
useRouter()获取 locale 即可,内容渲染逻辑不需要做额外修改
方案2:给多域名下的英文加命名空间前缀,适配内置规则
不需要引入中间件,通过调整 locale 命名适配内置校验逻辑:
- 把不同域名下的英文 locale 拆分为带域名前缀的独立标识,比如
de-en、fr-en、nl-en,所有带-en后缀的 locale 统一映射到英文内容资源
配置示例:// next.config.js module.exports = { i18n: { locales: ['de', 'de-en', 'fr', 'fr-en', 'nl', 'nl-en', 'en-US', 'en-GB'], defaultLocale: 'en-US', domains: [ { domain: 'sitename.com', defaultLocale: 'en-US', locales: ['en-US'] }, { domain: 'sitename.co.uk', defaultLocale: 'en-GB', locales: ['en-GB'] }, { domain: 'sitename.de', defaultLocale: 'de', locales: ['de', 'de-en'] }, { domain: 'sitename.fr', defaultLocale: 'fr', locales: ['fr', 'fr-en'] }, { domain: 'sitename.nl', defaultLocale: 'nl', locales: ['nl', 'nl-en'] }, ] } } - 在语言包加载逻辑中加一层映射即可,示例:
// i18n 资源加载逻辑 const getMessages = async (locale) => { if (locale.endsWith('-en')) { return import('./locales/en.json') } return import(`./locales/${locale}.json`) }
方案3:完全禁用内置i18n,自定义全链路逻辑
如果后续还有更多个性化路由需求,可以直接关掉 Next.js 内置 i18n,完全通过中间件处理路由匹配、locale 检测、路径重写逻辑,灵活性最高,不受任何内置规则限制。
内容的提问来源于stack exchange,提问作者The Banana Guy
相关产品推荐
相关产品推荐

