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

Next.js动态生成robots.txt失效,仅/robots路径可用的问题

解决Next.js动态生成robots.txt访问404的问题

核心问题原因

Next.js 默认不会自动将带 .txt 后缀的路径映射到 API 路由,因此直接访问 /robots.txt 会触发404,而不带后缀的 /robots 能正常匹配 API 路由。以下分场景给出解决方案:


方案1:Pages Router 直接生成(推荐)

无需依赖 API 路由,在 pages 目录下创建 robots.txt.ts 文件,通过服务端渲染直接返回内容:

// pages/robots.txt.ts
import type { GetServerSideProps } from 'next'

export const getServerSideProps: GetServerSideProps = async ({ res }) => {
  // 设置正确的响应头
  res.setHeader('Content-Type', 'text/plain')
  // 写入 robots 规则
  res.write(`User-agent: *
Allow: /
Disallow: /admin/
`)
  res.end()
  return { props: {} }
}

// 空组件,仅用于满足 Next.js 页面要求
export default function Robots() {
  return null
}

启动项目后访问 /robots.txt 即可直接获取内容。


方案2:App Router(Next.js 13+)直接生成

在 app 目录下创建 robots.txt/route.ts 文件,利用 App Router 的路由规则直接处理:

// app/robots.txt/route.ts
import { NextResponse } from 'next/server'

export function GET() {
  const robotsContent = `User-agent: *
Allow: /
Disallow: /admin/
`
  return new NextResponse(robotsContent, {
    headers: {
      'Content-Type': 'text/plain',
    },
  })
}

此方式无需额外配置,Next.js 会自动将 /robots.txt 映射到该路由。


方案3:保留原有 API 路由,配置重写规则

如果必须使用已有的 pages/api/robots.ts,需在 next.config.js 中添加重写规则,将 /robots.txt 转发到 API 路由:

基础配置方式

// next.config.js
/** @type {import('next').NextConfig} */
const nextConfig = {
  async rewrites() {
    return [
      {
        source: '/robots.txt',
        destination: '/api/robots',
      },
    ]
  },
}

module.exports = nextConfig

自定义插件方式(适配你已添加的插件)

确保你的 src/lib/next-config/plugins/robots.js 插件正确配置重写规则:

// src/lib/next-config/plugins/robots.js
module.exports = (nextConfig = {}) => {
  return {
    ...nextConfig,
    async rewrites() {
      // 保留原有重写规则(如果有)
      const existingRewrites = await nextConfig.rewrites?.() || []
      return [
        ...existingRewrites,
        {
          source: '/robots.txt',
          destination: '/api/robots',
        },
      ]
    },
  }
}

然后在 next.config.js 中引入并使用插件:

const robotsPlugin = require('./src/lib/next-config/plugins/robots')

const nextConfig = {
  // 你的其他配置项
}

module.exports = robotsPlugin(nextConfig)

最后确认 API 路由的响应头

确保 pages/api/robots.ts 返回正确的内容类型:

// pages/api/robots.ts
import type { NextApiRequest, NextApiResponse } from 'next'

export default function handler(req: NextApiRequest, res: NextApiResponse) {
  res.setHeader('Content-Type', 'text/plain')
  res.status(200).send(`User-agent: *
Allow: /
Disallow: /admin/
`)
}

排查验证步骤

  1. 清除 Next.js 缓存:运行 next dev --clear-cache 或重新执行 next build
  2. 检查重写规则是否存在拼写错误
  3. 确认 API 路由的响应头为 text/plain,而非默认的 application/json
  4. 验证 /healthz 能正常访问的前提下,测试 /robots.txt 是否跳转正确

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 01:40:10