新闻中心

Next.js 多域名站点地图生成指南

2025-11-16
浏览次数:
返回列表

next.js 多域名站点地图生成指南

本文档旨在解决在使用 Next.js 和 `next-sitemap` 包构建多域名站点时,如何为 `/pages` 目录下的路由生成站点地图的问题。我们将结合服务端渲染和动态数据,提供一个完整的解决方案,确保所有域名和路由都能正确地包含在站点地图中。

为 Next.js 多域名站点生成完整站点地图

在使用 Next.js 构建多语言、多域名站点时,生成准确且完整的站点地图至关重要。这有助于搜索引擎更好地抓取和索引你的网站,提高 SEO 效果。本文将介绍如何结合 next-sitemap 包,为包含静态路由(/pages 目录)和动态路由(CMS 数据)的 Next.js 应用生成多域名站点地图。

场景描述

假设你正在开发一个 Next.js 应用,该应用支持多个域名,每个域名对应一种语言。静态路由位于 /pages 目录下,动态路由数据来自 CMS。你需要为每个域名生成包含所有路由的站点地图。

解决方案

核心思路是结合 next-sitemap 的配置和 Next.js 的服务端渲染能力,将静态路由和动态路由的数据合并,生成完整的站点地图。

1. 处理动态路由(CMS 数据)

首先,我们需要一个函数来获取 CMS 中的动态路由数据,并根据不同的语言环境生成对应的 URL。以下是一个示例:

import { GetServerSideProps } from 'next';
import { getServerSideSitemap } from 'next-sitemap';
import { i18n } from '../next-i18next.config'; // 假设你使用了 next-i18next
import { fetchAPI } from '../utils/api'; // 你的 API 请求函数

interface ISitemapField {
  loc: string;
  lastmod: string;
  alternateRefs?: { href: string; hreflang: string; }[];
}

const languageToDomains = {
  en: 'example.com',
  cs: 'example.cz',
  de: 'example.de',
  ua: 'example.ua',
  pl: 'example.pl',
  'de-AT': 'example.at',
};

export const getServerSideProps: GetServerSideProps = async (ctx) => {
  const fields: ISitemapField[] = [];

  for (const locale of i18n.locales) {
    const urls = await fetchAPI<PageEntity[]>(`/${STRAPI_ENDPOINTS.PAGES}`, { params: { locale, populate: "localizations" } });

    fields.push(
      ...urls?.map(
        ({ generatedUrl, updatedAt, localizations }) =>
          ({
            loc: `https://${languageToDomains[locale]}${generatedUrl}`,
            lastmod: updatedAt,
            alternateRefs: localizations?.map(({generatedUrl: altUrl, locale: altLocale}) => ({
              href: `https://${languageToDomains[altLocale]}${altUrl}`,
              hreflang: altLocale,
            }
            ))
          } as ISitemapField),
      ),
    );
  }

  return getServerSideSitemap(ctx, fields);
};

// Default export to prevent next.js errors
export default () => {};

这段代码使用 getServerSideProps 函数,在服务器端获取 CMS 数据,并为每个语言环境生成对应的 URL。languageToDomains 对象定义了语言和域名之间的映射关系。

2. 处理静态路由(/pages 目录)

关键在于如何将 /pages 目录下的静态路由添加到站点地图中。一种方法是在 getServerSideProps 函数中手动添加静态路由:

ASP婚纱摄影工作室1.0 ASP婚纱摄影工作室1.0

本系统是一套为影楼婚纱摄影网站量身设计打造的商业网站建设系统,本系统以品牌介绍、作品展示、取景景点介绍、服务价格体系、加盟合作、人才招聘、联系我们、交流论坛八大主要功能模块 ,以及诸多实用的辅助模块组成。用户名:8minutemanager 密码:ersui1215 后台地址http://www.你的域名.com/8minutemanager 修改了: 1、编辑器无法上传图片的问题 2、新

ASP婚纱摄影工作室1.0 0 查看详情 ASP婚纱摄影工作室1.0
export const getServerSideProps: GetServerSideProps = async (ctx) => {
  const fields: ISitemapField[] = [];

  // 添加所有静态路由
  const staticRoutes: ISitemapField[] = [
    {
      loc: `https://example.com`, // 替换为你的域名
      lastmod: new Date().toISOString(),
      alternateRefs: i18n.locales.map(locale => ({
        href: `https://${languageToDomains[locale]}`, // 替换为你的域名
        hreflang: locale,
      })),
    },
    {
      loc: `https://example.com/about`, // 替换为你的域名
      lastmod: new Date().toISOString(),
      alternateRefs: i18n.locales.map(locale => ({
        href: `https://${languageToDomains[locale]}/about`, // 替换为你的域名
        hreflang: locale,
      })),
    },
    // 添加更多静态路由
  ];

  for (const locale of i18n.locales) {
    const urls = await fetchAPI<PageEntity[]>(`/${STRAPI_ENDPOINTS.PAGES}`, { params: { locale, populate: "localizations" } });

    fields.push(
      ...urls?.map(
        ({ generatedUrl, updatedAt, localizations }) =>
          ({
            loc: `https://${languageToDomains[locale]}${generatedUrl}`,
            lastmod: updatedAt,
            alternateRefs: localizations?.map(({generatedUrl: altUrl, locale: altLocale}) => ({
              href: `https://${languageToDomains[altLocale]}${altUrl}`,
              hreflang: altLocale,
            }
            ))
          } as ISitemapField),
      ),
    );
  }


  const allRoutes = [...staticRoutes, ...fields];

  return getServerSideSitemap(ctx, allRoutes);
};

// Default export to prevent next.js errors
export default () => {};

在这个例子中,我们创建了一个 staticRoutes 数组,手动添加了 / 和 /about 路由。你需要根据你的项目,添加所有静态路由。

3. 配置 next-sitemap.config.js

module.exports = {
  siteUrl: 'http://localhost:3000', // 替换为你的默认域名,这里只是占位符
  exclude: ['/server-sitemap.xml'], // 排除服务端生成的站点地图
  generateRobotsTxt: true,
  robotsTxtOptions: {
    additionalSitemaps: [`http://localhost:3000/server-sitemap.xml`], // 包含服务端生成的站点地图
  },
  transform: async (_, path) => {
    return {
      loc: path,
      lastmod: new Date().toISOString(),
    };
  },
};

next-sitemap.config.js 文件用于配置 next-sitemap 包。这里需要注意以下几点:

  • siteUrl:设置为你的默认域名,但这个配置在服务端生成的站点地图中会被覆盖。
  • exclude:排除服务端生成的站点地图,防止重复生成。
  • robotsTxtOptions:包含服务端生成的站点地图到 robots.txt 文件中。

4. 注意事项

  • 确保 languageToDomains 对象包含所有语言和域名之间的映射关系。
  • 手动添加静态路由时,需要仔细检查,确保所有路由都被包含。
  • 根据你的 CMS 数据结构,调整 fetchAPI 函数和数据处理逻辑。
  • siteUrl 在 next-sitemap.config.js 只是占位符,因为我们在服务端渲染中动态生成 URL。

5. 总结

通过结合 next-sitemap 的配置和 Next.js 的服务端渲染能力,我们可以为多域名站点生成完整的站点地图。关键在于:

  • 使用 getServerSideProps 函数获取动态路由数据。
  • 手动添加静态路由到 getServerSideProps 函数中。
  • 正确配置 next-sitemap.config.js 文件。

希望本文能够帮助你解决 Next.js 多域名站点地图生成的问题。记住,根据你的具体项目,可能需要进行一些调整。

以上就是Next.js 多域名站点地图生成指南的详细内容,更多请关注其它相关文章!


# 本系统  # 如何优化seo链接  # 江苏网站营销seo方案推广  # seo小视频  # 运城短视频seo设计  # 如何做好网站的seo搜索引擎优化  # 包装网站网络推广公司  # 白云网站优化推广平台  # 公司网站链接优化工具  # 河北抖音营销推广代理  # 做网站建设推广赚钱吗  # 图中  # 关键在于  # js  # 目录下  # 婚纱摄影  # 数据结构  # 如何用  # 服务端  # 商业网站建设系统  # 搜索引擎  # 多语言  # 路由  # ai  # seo  # cms 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: Composer如何处理Git子模块(submodule)依赖_Composer与Git Submodule的对比与选择  Golang如何使用net/url解析URL_Golang URL解析与处理方法  漫蛙manwa2最新登录网址_漫蛙manwa2手机网页版入口  QQ邮箱官方网站登录入口_QQ邮箱网页版在线使用  ACG动漫手机版官网入口 手机ACG动漫APP在线观看正版  蛙漫2台版漫画地址 Manwa2正版网页版链接  composer的"require-dev"部分是用来做什么的?  汽水音乐网页版使用入口_汽水音乐电脑版播放指南  包子漫画官方网站在线链接-包子漫画在线阅读平台主页地址  抖音小游戏合成大西瓜免费秒玩入口链接 抖音小游戏热门合集秒玩网站  从J*aScript对象中精确提取指定属性的教程  Go语言中Map存储的结构体如何调用指针方法:深入解析与实践  树莓派传感器触发:通过Twilio API发送WhatsApp消息教程  Win10双系统截图高效法 截屏快捷键速记【技巧】  cad怎么合并重叠的线段_cad清理重复重叠线条的操作方法  电脑屏幕颜色不舒服怎么办_Windows夜间模式与色彩校准教程【护眼技巧】  ArrayList与LinkedList核心操作的Big-O复杂度分析  J*aScriptWebpack优化_J*aScript构建工具实战  探索高级语言到C/C++的转译路径:以Go为例及内存管理策略  C++如何使用AddressSanitizer(ASan)_C++调试工具中检测内存访问错误的利器  Animex动漫社网入口地址 Animex动漫社网正版在线入口  文心一言怎样用插件调度API数据_文心一言用插件调度API数据【API调用】  KFC早餐时段怎么领特惠代码_KFC早餐订餐优惠代码获取与使用说明  蛙漫漫画免费阅读入口_蛙漫官方正版无广告纯净版  sublime怎么进行远程开发编辑_配置rsub/rmate实现sublime编辑服务器文件  Node.js 中使用 node-cron 实现定时 API 数据抓取与处理  在python-socketio事件处理器中安全访问Flask应用上下文  J*aScript中高效管理与清空动态列表:避免循环陷阱  J*aScript数组对象转换:按指定键分组与值收集  LINUX下如何进行磁盘分区_fdisk与parted工具在LINUX中的使用对比  德邦快递查询平台 德邦快递物流信息查询入口  mcjs网页版在线存档 mcjs云存档登录入口  C++ map遍历方法大全_C++ map迭代器使用总结  PHP高效扁平化嵌套数组:使用array_merge与数组解包操作符  Fabric Mod开发:在1.19.3+版本中正确添加自定义物品并管理物品组  css链接悬停下划线样式如何自定义_使用::after结合content和transition  谷歌推RCS信息存档功能:公司可监控员工私密信息!  想当下一个《2077》?《心之眼》Steam评价升至"多半好评"  Win10系统服务哪些可以禁用 Win10安全优化服务列表【干货】  vivo手机互传视频怎么操作_vivo手机互传视频详细传输方法  “在文档元素之后找到了标记”是什么错误? 检查并修复XML中多个根元素的3个方法  如何在CSS中使用浮动制作导航栏_float实现水平菜单  J*a中实现Go语言select通道多路复用机制  PHP中高效并行检查多链接状态的教程  大麦的“候补”是什么意思 大麦候补购票规则【详解】  如何在低配置电脑上搭建轻量级J*a环境_占用更小的环境选择技巧  Golang如何实现状态模式管理对象状态_Golang State模式实现技巧  正确连接J*aScript到HTML实现可点击图片与自定义事件处理  铁路12306卧铺选择攻略 铁路12306下铺座位预定技巧  构建轻量级网站内部消息系统:Formspree 集成指南 

搜索