TL;DR

三篇博文(performance-optimizationknowledge-management-toolsmediawiki-guide)在 Cloudflare Pages 上 404。根因:文件名与 slug 不匹配,Astro 在 SSR 模式下动态路由找不到对应 content 条目。

摘要

  • 影响:3 篇文章无法在线访问
  • 根因:Markdown 文件名与 frontmatter 中隐含 slug 约定不一致
  • 修复:重命名文件名使其与 URL 路径匹配

时间线

时间事件
06-08构建 22 页成功,3 篇返回 404
06-09初步排查:本地 preview 正常,线上 404
06-10确认是 SSR 模式下 slug 解析差异
06-11重命名文件,重新构建部署

根因分析

Astro 的 Content Collections 根据文件名生成 slug。如果文件名是 my-article.md,slug 就是 my-article,URL 就是 /blog/my-article

问题出在这三篇文章:

文件名期望 URL实际 slug结果
blog-performance-optimization.md/blog/performance-optimizationblog-performance-optimization404
personal-knowledge-management.md/blog/knowledge-management-toolspersonal-knowledge-management404
building-personal-wiki-with-mediawiki.md/blog/mediawiki-guidebuilding-personal-wiki-with-mediawiki404

本地 SSG 模式下,所有 slug 都会生成对应 HTML 文件,所以不会 404。但 SSR 模式下,Cloudflare Worker 按路径查找 content 条目,找不到就返回 404。

修复方案

方案 1:重命名文件(推荐)

把文件名改成与期望 URL 一致:

mv blog-performance-optimization.md performance-optimization.md
mv personal-knowledge-management.md knowledge-management-tools.md
mv building-personal-wiki-with-mediawiki.md mediawiki-guide.md

方案 2:在 frontmatter 中指定 slug

Astro 6.x 支持在 frontmatter 中指定 slug

---
title: '性能优化'
slug: 'performance-optimization'
---

但这需要 Astro 6.4+ 的 Content Collections API 支持。

最终采用

方案 1,重命名文件。最简单、最可靠,不依赖版本特性。

教训

  • 文件名就是 slug:在 Astro Content Collections 中,文件名直接决定 URL 路径
  • SSG 和 SSR 的路由差异:SSG 会为所有 slug 生成文件,SSR 只按请求查找
  • 本地 preview 不等于线上:两种模式路由解析逻辑不同

延伸阅读

种下你的想法

在花园里留下一条评论,和这篇文章一起生长。

COMMENTS