Next.js结合next-i18next多域名场景下站点地图(sitemap)的部署方案咨询
首先得给你提个醒:你想把sitemap直接放到.next/server/pages下的locale文件夹这个思路不太可行,因为.next是Next.js构建过程中生成的临时运行目录,每次执行next build的时候这个目录都会被清空重建,你手动放进去的文件会被直接覆盖掉,根本留不住。
那正确的做法应该怎么搞?结合你的多域名+next-i18next的场景,我给你梳理几个关键步骤,保证符合SEO最佳实践:
1. 把生成的sitemap按locale放到public目录的子文件夹里
Next.js的静态资源默认是从public目录读取的,你可以给每个locale创建对应的子目录,比如:
public/en/sitemap.xml(对应example.com的站点地图)public/de/sitemap.xml(对应example.de的站点地图)
修改你的sitemap生成脚本,把每个locale对应的sitemap直接输出到public/{locale}目录下,这样构建的时候这些文件会被自动打包到静态资源里,不会被清空。
2. 配置next.config.js的多域名映射
既然你用的是多域名而非子路径路由,必须在next.config.js里配置i18n.domains,把每个域名和对应的locale绑定起来,示例配置如下:
module.exports = { i18n: { locales: ['en', 'de'], defaultLocale: 'en', domains: [ { domain: 'example.com', defaultLocale: 'en', }, { domain: 'example.de', defaultLocale: 'de', }, ], }, };
这个配置的作用是:当用户访问example.com/sitemap.xml时,Next.js会自动去public/en/sitemap.xml找对应的文件;访问example.de/sitemap.xml时,会匹配public/de/sitemap.xml,完美实现不同域名根路径访问对应站点地图的需求。
3. SEO层面的关键优化
既然你的项目非常依赖SEO,这几个细节一定要做好:
- 每个sitemap只包含对应域名的URL:绝对不要把example.com的链接放到example.de的sitemap里,避免搜索引擎混淆站点归属。
- 配置对应域名的robots.txt:同样按locale在
public/{locale}下生成robots.txt,比如public/en/robots.txt里要加上Sitemap: https://example.com/sitemap.xml,public/de/robots.txt里加上Sitemap: https://example.de/sitemap.xml,引导搜索引擎快速发现你的站点地图。 - 确保sitemap的URL规范:所有链接都要用对应域名的HTTPS地址,不要用相对路径或者其他域名的链接,避免死链或者跨域问题。
- 避免sitemap互相引用:不同域名的sitemap之间不要交叉引用,保持各自独立,符合搜索引擎的抓取规范。
4. 静态导出场景的补充说明
如果你用的是next export做静态站点导出,那public目录下的locale子文件夹会被直接输出到out目录的对应子目录里(比如out/en/sitemap.xml、out/de/sitemap.xml)。部署的时候,只需要把每个域名的根目录指向out/{locale}即可,这样用户访问域名根路径的sitemap.xml就能直接访问到对应的文件了。
总结一下:核心就是利用Next.js的多域名locale映射机制,把按locale分类的sitemap放到public目录的对应子文件夹,再通过next.config.js绑定域名和locale,既不会被构建过程覆盖,又能完美实现不同域名根路径访问对应sitemap的需求,同时完全符合SEO的要求。
备注:内容来源于stack exchange,提问作者Reinier68

