You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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路径请求,直接重写为对应en locale 的内容,不会触发内置 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 07:39:03