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

Next.js13生产环境sitemap.xml无法动态更新问题求助

Next.js 13 动态生成Sitemap生产环境不更新数据的问题解决

我正在开发Next.js 13项目,尝试为应用实现动态生成的sitemap.xml,sitemap.ts文件放置在app目录根目录(符合官方文档要求)。开发环境下访问/sitemap.xml会触发HTTPS请求获取最新数据,但生产环境中不会调用生成最新数据的函数。请问该如何解决?

获取所有serp页面用于生成XML路由的函数

export default async function getSitemapSerps() {
  const res = await fetch(
    url,
    { cache: 'no-store' }
  );
  if (!res.ok) return null;
  return res.json();
}

sitemap.ts文件代码

import { MetadataRoute } from 'next';
import getSitemapSerps from './lib/getSitemapSerps';

export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
  const baseUrl = 'https://url';
  const sitemapSerpsData: Promise<number[] | []> = getSitemapSerps();
  const sitemapSerps = await sitemapSerpsData;
  const serpUrls = sitemapSerps.map((sitemap) => ({
    url: `${baseUrl}/dashboard/serp/${sitemap.toString()}`,
    lastModified: new Date(),
  }));

  return [
    ...serpUrls,
  ];
}

我已经尝试了所有能找到的方法!


解决方案

Next.js 13 App Router中,sitemap.ts默认会被静态缓存,生产环境不会主动触发重新生成,这是核心问题。可以通过以下几种方式解决:

1. 强制动态生成

在sitemap.ts中添加dynamic = 'force-dynamic'配置,让每次请求sitemap.xml时都重新执行函数获取最新数据:

import { MetadataRoute } from 'next';
import getSitemapSerps from './lib/getSitemapSerps';

// 强制每次请求都动态生成
export const dynamic = 'force-dynamic';

export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
  const baseUrl = 'https://url';
  const sitemapSerps = await getSitemapSerps();
  // 处理返回null的情况,避免map报错
  const serpUrls = sitemapSerps ? sitemapSerps.map((sitemap) => ({
    url: `${baseUrl}/dashboard/serp/${sitemap.toString()}`,
    lastModified: new Date(),
  })) : [];

  return [
    ...serpUrls,
  ];
}

2. 设置定时重新生成

如果不需要实时更新,可以指定重新生成的时间间隔(比如每小时一次),在sitemap.ts中添加revalidate配置:

import { MetadataRoute } from 'next';
import getSitemapSerps from './lib/getSitemapSerps';

// 每3600秒(1小时)重新生成一次
export const revalidate = 3600;

export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
  // 剩余代码同上
}

3. 确保fetch请求的缓存策略生效

虽然你已经在fetch中设置了cache: 'no-store',但可以结合sitemap.ts的缓存配置一起使用,同时检查生产环境中url对应的接口是否能正常访问(比如是否有防火墙、权限限制等问题)。

4. 处理空数据情况

原代码中如果getSitemapSerps返回null,执行map会报错,建议添加空值判断,避免生产环境出现500错误。


内容的提问来源于stack exchange,提问作者Vlada Stefanovic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 12:17:28