如何为NextJS App Router+Strapi国际化配置next-sitemap生成正确文件
NextJS 15 App Router 下 robots.txt 无法访问的解决方法
核心问题分析
NextJS 15 App Router 对静态资源的处理逻辑和 Pages Router 不同,public 目录的静态文件可能因构建流程、路由冲突或缓存问题无法正常访问;同时 next-sitemap 默认配置适配 Pages Router,直接套用会导致生成的文件无法被正确部署。
解决方法一:用 App Router 路由直接生成 robots.txt(最稳妥)
这种方式完全绕过静态文件的问题,通过路由动态返回 robots.txt 内容,适配 App Router 架构:
在项目根目录的
app文件夹下,创建robots.txt目录,然后在该目录内新建route.ts文件:app/ └── robots.txt/ └── route.ts在
route.ts中写入以下代码:
import { NextResponse } from 'next/server'; export function GET() { const robotsContent = `User-agent: * Allow: / Disallow: /pl Disallow: /pl/* Disallow: /en Disallow: /en/* Disallow: /admin Sitemap: https://www.website.com.pl/sitemap.xml Sitemap: https://www.website.com.pl/sitemap-0.xml `; return new NextResponse(robotsContent, { headers: { 'Content-Type': 'text/plain', }, }); }
- 重新构建部署后,访问
https://website.com.pl/robots.txt即可看到正确内容。
解决方法二:修复 next-sitemap 配置适配 App Router
如果坚持使用 next-sitemap 生成文件,需调整配置适配 App Router 的构建流程:
- 确保安装最新版
next-sitemap:
npm install next-sitemap@latest
- 修改
next-sitemap.config.js,将输出目录改为 App Router 的静态资源目录:
/** @type {import('next-sitemap').IConfig} */ module.exports = { siteUrl: "https://website.com.pl", outDir: ".next/static", // 替换原有的 "public" generateRobotsTxt: true, sitemapSize: 100, generateIndexSitemap: true, exclude: ["/pl*", "/en*"], robotsTxtOptions: { policies: [ { userAgent: "*", allow: ["/", "/*"], disallow: ["/pl", "/pl/*", "/en", "/en/*", "/admin"], }, ], additionalSitemaps: [ "https://www.website.com.pl/sitemap.xml", "https://www.website.com.pl/sitemap-0.xml", ], }, };
- 更新
package.json中的构建脚本,确保next-sitemap在构建后执行:
"scripts": { "build": "next build && next-sitemap", "start": "next start" }
- 清理缓存后重新构建:
rm -rf .next public npm run build npm run start
此时本地启动生产环境后,即可访问 /robots.txt 和 /sitemap.xml。
额外说明:为什么 public 目录静态文件无效?
App Router 中 public 目录的文件会被部署,但如果存在以下情况会导致访问失败:
next-sitemap生成的文件覆盖了public目录下的静态文件- 构建时缓存未清理,旧文件未被替换
- 服务器部署时未正确同步
public或.next/static目录的文件
内容的提问来源于stack exchange,提问作者grabarzo
相关产品推荐
相关产品推荐

