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

Next.js 13动态页面为何传入favicon.ico作为id参数?

问题原因

浏览器会自动请求网站根目录的favicon.ico文件用于显示标签页图标,由于你的项目中没有这个文件,Next.js的App Router会将该请求匹配到动态路由/app/[id]/page.tsx,把favicon.ico作为id参数传入。

关于TypeScript类型定义的疑惑:params.id的number类型只是编译时校验,运行时Next.js传递的参数本质是字符串,编译时的类型断言不会在运行时做自动类型转换,所以"favicon.ico"会被直接传入数据请求函数,导致报错。

解决方案

1. 添加favicon.ico文件(最直接)

在项目的public目录下放置一个favicon.ico文件,浏览器请求该文件时会直接获取资源,不会触发动态路由匹配。

2. 配置Next.js重写规则

在next.config.js中添加重写规则,将favicon.ico的请求指向正确资源或返回404,避免触发动态路由:

/** @type {import('next').NextConfig} */
const nextConfig = {
  async rewrites() {
    return [
      {
        source: '/favicon.ico',
        destination: '/favicon.ico', // 有文件则指向它,无文件可指向占位图或404
      },
    ];
  },
};

module.exports = nextConfig;

若没有favicon文件,也可直接返回404:

// next.config.js
const nextConfig = {
  async rewrites() {
    return [
      {
        source: '/favicon.ico',
        destination: '/404',
      },
    ];
  },
};

3. 在动态页面中添加参数校验

在Page组件开头对params.id进行校验,确保它是有效数字,否则返回404页面:

// /app/[id]/page.tsx
import { notFound } from 'next/navigation';

export default async function Page({ params }: ProfilePageProps) {
  // 校验id是否为有效整数
  const id = Number(params.id);
  if (isNaN(id) || !Number.isInteger(id)) {
    notFound(); // 返回404页面
  }

  const session = await getServerSession(authOptions);
  // ... 剩余业务代码
}

注意运行时params.id是字符串类型,需要先转为数字再判断有效性。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 11:25:08