网站设置 /

页面不存在时:该用重定向还是 404?

当访客打开一个不存在的网址时,你有两种处理方式:跳转(重定向)到另一个页面,或者返回一个「页面不存在」提示页(404)。这两者看起来都能“不让用户看到报错”,但它们的含义完全不同,用错了会伤害 SEO 和用户体验。

这篇教程帮你分清二者的区别,并给出在 Creght 里的正确做法。

一句话结论

  • 具体的旧网址搬到了新网址 → 用重定向

  • 网址本身就不该存在(打错、已删除、乱猜的链接) → 返回 404,用一个友好的 404 页引导用户。

  • 不要把所有不存在的网址统统重定向到首页 —— 这是搜索引擎明确不推荐的做法。

重定向和 404 到底差在哪

重定向(Redirect)404 页面
地址栏 URL会变(跳到新地址)不变(停留在原地址)
HTTP 状态码301 / 308(永久)、302 / 307(临时)404
含义“这个内容搬到别处了,去那边看”“这个内容不存在”
搜索引擎理解把旧网址的权重转移到新网址知道该网址无效,将其从索引中移除
适用场景已知的、一对一的网址迁移任何未知 / 已失效的网址

关键点:重定向是“搬家通知”,404 是“查无此人”。一个不存在的乱猜网址并没有“搬到”任何地方,所以它不该被重定向,而应该老老实实告诉搜索引擎和用户“这里没有内容”。

三种常见场景,分别怎么做

场景一:给访客一个友好的“页面不存在”提示

访客打错网址、或点了一个已经删掉的链接。你希望页面不要太生硬,最好带上返回首页的入口、搜索框、或热门内容推荐。

做法:做一个自定义 404 页。URL 保持不变,状态码返回 404,页面内容由你自己设计。这是绝大多数情况下的正确选择。

场景二:某个旧网址已经搬到新网址

比如你把 /old-blog/hello 换成了 /posts/hello,老链接还在别处被引用、被收藏、被搜索引擎收录。

做法:配置一条重定向规则,用永久重定向(308)把旧网址指向新网址。这样访客和搜索引擎都会被平滑地带到新地址,旧网址积累的 SEO 权重也会转移过去。

场景三:想把所有未知网址都甩到首页

这看起来“很干净”,但强烈不推荐

  • 对搜索引擎:Google 会把“内容不存在却返回 200 或跳转到首页”判定为 软 404(Soft 404),反而拉低网站质量评分。Google 官方建议不存在的页面应当返回真实的 404。

  • 对用户:访客以为自己点错了,却莫名其妙到了首页,很困惑,也找不到原本想要的内容。

正确做法:返回 404,然后在 404 页面里放一个显眼的“返回首页”按钮。既符合搜索引擎规范,也照顾了用户体验。

在 Creght 里怎么做

1. 自定义 404 页:新建 page/404.tsx

在页面目录下新建一个名为 404 的页面(page/404.tsx)。之后,任何没有匹配到的网址都会自动渲染这个页面,并返回 404 状态码,地址栏保持访客输入的原网址。

// page/404.tsx
export default function NotFound() {
  return (
    <main style={{ textAlign: 'center', padding: '80px 20px' }}>
      <h1>404</h1>
      <p>抱歉,你访问的页面不存在。</p>
      <a href="/">返回首页</a>
    </main>
  )
}

同理,你也可以新建 page/500.tsx 来自定义“服务器出错”时的页面。

小贴士:404 页也可以像普通页面一样使用组件、样式和 getServerSideProps,比如展示推荐文章或站内搜索框。

2. 配置重定向:在 talizen.config.ts 里写 redirects

对于“已知网址迁移”,在站点根目录的 talizen.config.ts 中配置重定向规则:

// talizen.config.ts
export default {
  redirects: [
    // 精确匹配:308 永久重定向
    { source: '/old-page', destination: '/new-page', permanent: true },
    // 通配符匹配:把 /blog 下的路径整体迁移到 /posts(307 临时)
    { source: '/blog/*', destination: '/posts/*', permanent: false },
  ],
}
  • permanent: true 返回 308(永久重定向),适合内容确实永久搬家、希望转移 SEO 权重的情况。

  • permanent: false 返回 307(临时重定向),适合临时性的跳转。

  • source 支持精确匹配和结尾 /* 通配符(* 命中的路径段会回填到 destination*)。

重定向规则优先于页面匹配:命中规则的网址会直接跳转,不再进入页面渲染,因此不会触发 404。

决策速查

  • 这个网址曾经有内容、现在搬走了?→ 重定向talizen.config.tsredirects,永久用 308)。

  • 这个网址从来就不该存在?→ 404(自定义 page/404.tsx,页内放返回首页入口)。

  • 拿不准?→ 默认用 404。它是最安全、对 SEO 最友好的兜底方案。

Render diagnostics