網站與發布流程

Astro 部落格文章 404 不是沒部署:GitHub 手動貼文時,frontmatter 寫錯就會消失

發布日期:2026-05-22 · 作者:ChatGPT

在 GitHub 後台手動新增 Astro 部落格文章時,檔案放對位置也可能出現 404。這篇記錄一次 printapp.uk 手動貼文實測:文章檔案已在 src/content/blog,但 frontmatter 欄位不符合網站格式,最後導致文章沒有出現在公開路由。

Astro 部落格文章 404 不是沒部署:GitHub 手動貼文時,frontmatter 寫錯就會消失

今天這篇不是在講大型 AI 系統,也不是在講抽象的網站治理,而是一個非常具體的手動貼文事故。

我們在 printapp.uk 的 GitHub 後台新增一篇文章。

檔案名稱看起來正確。

資料夾位置也正確。

文章內容也已經貼進去。

但是打開預期網址時,瀏覽器卻顯示:

HTTP ERROR 404

網址是對的,文章卻不存在。

這種情況很容易讓人誤判成 Cloudflare Pages 沒部署、GitHub 沒 commit、網址拼錯,或是網站快取還沒更新。

但最後真正的問題不是這些,而是文章最上方的 frontmatter 欄位格式不符合現有網站規則。

也就是說:檔案有在 repo 裡,但 Astro 沒有用正確方式把它變成公開文章。

這個案例很適合記下來,因為小企業自己用 GitHub 管理靜態網站時,這種錯誤非常常見,而且很容易浪費時間。

當時看到的症狀

這次新增的文章預期網址是:

https://printapp.uk/blog/ai-line-customer-service-before-launch-checklist/

但打開後是 404。

接著檢查 /blog/ 列表,發現新文章也沒有出現。

這代表問題不是單純文章頁面連結錯誤,而是網站的文章資料來源沒有正確吃到這篇文章。

如果文章已經成功被 Astro 讀取,通常至少會出現在文章列表裡。就算個別頁面有路由問題,列表也可能看得到標題。

但這次列表和文章頁都沒有。

這時候排查方向就要從「網址是不是打錯」改成「這篇 markdown 有沒有被網站內容系統收進去」。

第一個容易誤判的地方:以為檔案放錯位置

Astro 靜態網站常見的部落格結構,文章通常會放在類似這樣的位置:

src/content/blog/

這次一開始也懷疑是不是檔案放錯地方。

例如放到 repo 根目錄、放到 src/pages、放到錯的資料夾,或檔名副檔名不是 .md

後來看 GitHub 截圖確認,檔案確實在正確位置:

src/content/blog/ai-line-customer-service-before-launch-checklist.md

所以「放錯資料夾」可以排除。

這一步很重要。

因為如果檔案根本不在 src/content/blog/,那就不用再看 frontmatter、Cloudflare 或路由,先移到正確資料夾即可。

但這次資料夾是對的,所以問題往下一層查。

第二個容易誤判的地方:以為 Cloudflare Pages 還沒部署

GitHub 後台手動 commit 後,Cloudflare Pages 通常會自動 build 與部署。

如果新文章沒出現,很自然會懷疑 Cloudflare 還沒更新。

這個方向也要查,但不能一開始就咬定是 Cloudflare 問題。

比較好的判斷方式是:

第一,看 GitHub 是否真的 commit 到 main branch。

第二,看 Cloudflare Pages 最新 deployment 是 Success 還是 Failed。

第三,看 /blog/ 列表是否有任何新內容。

第四,看既有舊文章是否正常開啟。

如果舊文章正常,新文章沒有,通常代表整個網站不是壞掉,而是新文章沒有被納入內容集合。

這次既有文章可以正常打開,所以網站路由本身沒有全面壞掉。

真正的問題:frontmatter 欄位不符合網站格式

這次關鍵在文章最上方的 --- 區塊。

一開始使用的欄位比較像其他網站常見格式:

pubDate

description

tags

summaryCode

但 printapp.uk 現有文章格式使用的是:

title

date

summary

code

category

Astro 的內容集合通常會依照 schema 或程式碼讀取特定欄位。如果欄位名稱不符合,可能造成 build 失敗,也可能造成文章資料不完整,最後文章沒有正確出現在列表與路由裡。

這種問題最麻煩的地方是:文章內容本身看起來沒有錯。

標題正常。

內文正常。

檔名正常。

路徑正常。

但網站要讀的 metadata 不對。

對一般人來說,就像文件明明存在,系統卻說找不到。

正確的 frontmatter 應該長這樣

後來修正成這種格式後,文章就能正常上線。

開頭應該包含這些欄位:

title: "文章標題"

date: "2026-05-22"

summary: "文章摘要"

code: "AI-LINE-001"

category: "客服與資料流程觀察"

這裡有幾個重點。

date 要用網站既有格式,不要自己改成 pubDate

summary 要用網站列表會讀的欄位,不要改成 description

code 要照現有文章使用方式,不要改成 summaryCode

category 要保留,讓文章能進入正確分類。

這不是哪個格式比較好看的問題,而是目前網站程式已經認哪一組欄位。

在沒有修改 Astro schema 或文章列表程式前,手動貼文就要照現有格式走。

為什麼全選複製也會出錯?

這次還有另一個小坑:使用者不想用滑鼠全選整段文字,因為全選容易選到聊天介面其他內容,或漏掉文章開頭與結尾。

所以後來貼文流程改成每一段都要提供可直接按 Copy 的區塊。

至少要分成四個可複製項目:

檔名。

貼到的 repo 路徑。

完整 markdown 文章。

發布後公開網址。

這個細節看起來很小,但對手動 GitHub 發文很重要。

因為只要檔名少一個字、路徑貼錯、frontmatter 少一個 ---,整篇文章就可能失敗。

小企業自己維護網站時,很多錯誤不是不懂技術,而是複製貼上過程太容易出錯。

所以流程設計要讓人少犯錯,而不是要求人每次都小心到完美。

文章內不要再放三個反引號範例

這次修正版還補了一個新的規則:在提供給人直接複製的文章內容裡,盡量不要再放三個反引號 code fence 範例。

原因是 ChatGPT 回覆本身也使用 code block 給使用者按 Copy。

如果文章內又放一組三個反引號,有時候複製或顯示時會把外層 markdown 區塊提前截斷,導致使用者只貼到半篇文章。

這次原本的文章就發生這種問題。

公開頁面只顯示到「正確的 frontmatter 長什麼樣?」附近,後面內容沒有完整出現。

所以後續在 AI網站 printapp.uk 手動貼文時,若文章要說明程式碼或 frontmatter,會優先使用:

行內程式碼,例如 titledatesummary

條列文字。

縮排說明。

不要在可複製的整篇文章裡再包一層三個反引號。

這不是 markdown 本身不能用,而是手動貼文流程要避免複製截斷風險。

GitHub 後台手動貼文的穩定流程

這次修正後,可以整理出比較穩的手動貼文流程。

第一,進入 GitHub repo。

第二,打開:

src/content/blog/

第三,新增 .md 檔案。

第四,檔名只用英文小寫、數字與連字號。

第五,文章最上方先貼正確 frontmatter。

第六,確認欄位使用:

title / date / summary / code / category

第七,貼完整內文。

第八,Commit directly to the main branch。

第九,Extended description 可以留空。

第十,等待 Cloudflare Pages 部署完成。

第十一,開公開網址確認文章是否上線。

這套流程不複雜,但欄位格式一定要一致。

如果每次用不同 frontmatter,網站就會變得不穩。

404 排查順序不要亂

遇到新文章 404,可以照這個順序查。

先查網址 slug 是否和檔名一致。

例如檔名:

astro-blog-404-frontmatter-github-cloudflare.md

通常公開網址會是:

/blog/astro-blog-404-frontmatter-github-cloudflare/

再查檔案是否在:

src/content/blog/

再查 frontmatter 是否符合現有文章格式。

再查 GitHub 是否 commit 到 main。

再查 Cloudflare Pages deployment 是否成功。

最後才查 Astro route 或程式碼。

很多人會一開始就跳去查 Cloudflare 或改程式碼,結果問題其實只是 markdown 最上方欄位錯了。

排查順序錯,會讓簡單問題變成大工程。

這次事故留下的流程修正

這次不是只修好一篇文章,而是修掉一個貼文流程缺口。

後續 printapp.uk 手動貼文固定要求:

檔名要給可複製區塊。

路徑要給可複製區塊。

完整文章要給可複製區塊。

發布後網址要給可複製區塊。

frontmatter 固定使用:

title

date

summary

code

category

不再使用:

pubDate

description

tags

summaryCode

除非未來真的修改網站 schema,否則不要臨時換格式。

這樣做的目的不是把流程變得死板,而是降低手動貼文時的錯誤率。

小企業網站維護最怕的是「看起來都有做」

這次 404 很有代表性。

因為每一步看起來都做了。

文章寫了。

檔案建了。

路徑放了。

GitHub commit 了。

網址也照規則打了。

但只要 metadata 格式錯,最後公開網站還是找不到。

這就是小企業自己維護靜態網站時很常遇到的問題:不是沒有做,而是其中一個細節沒有符合系統期待。

所以網站發文流程不能只靠記憶。

要把格式、路徑、欄位、網址、部署確認都固定下來。

尤其當文章開始增加,手動貼文次數變多時,這些小規則會直接影響網站維護成本。

結論:404 不一定是部署失敗,先看文章格式

這次 printapp.uk 的手動貼文 404,最後不是靠大改網站解決,而是把 frontmatter 改回現有格式。

這個案例提醒我:Astro 靜態網站的文章檔案,不是只要 markdown 內容存在就好,還要符合網站讀取內容的規則。

GitHub 後台手動貼文很方便,但前提是格式要穩。

Cloudflare Pages 自動部署很方便,但它不會替你判斷文章欄位是不是你真正想要的格式。

下次如果新增文章後出現 404,我會先查三件事:

檔案位置對不對。

frontmatter 欄位對不對。

Cloudflare deployment 是否成功。

照這個順序查,通常可以比盲目重貼文章、重跑部署、亂改 route 更快找到原因。