跳至主要内容

大小寫問題讓網站連結失效

· 閱讀時間約 3 分鐘

發現問題

今天偶然發現之前寫的多益資源整理,這篇文章連結點下去會直接跳回首頁。

奇怪,網址明明還停在 /blog/toeic-resources-2026/,內容卻是首頁。

但我在本地跑沒有問題啊!?

想說是不是 Cloudflare Pages 的問題,但往回前翻好幾版都有這個問題。

找出問題

我先去看了 sitemap、RSS、文章列表頁,所有指向這篇的連結都是小寫 /toeic-resources-2026/,沒有問題。

也跑去看了 public/blog/ 底下的資料夾,確實有 toeic-resources-2026/index.html,檔案在啊。

那為什麼 Cloudflare 找不到?

我請 AI 幫我比對 git 跟磁碟上的檔名,這時候真相浮出水面:

GIT:  public/blog/TOEIC-resources-2026/index.html
DISK: public/blog/toeic-resources-2026/index.html

兩邊的大小寫不一樣。

為什麼

雖然我想不起來了,不過最有可能的情況應該是,我手動把資料夾從大寫的 TOEIC-resources-2026 改成小寫的 toeic-resources-2026,因為其他文章 slug 都是小寫,看起來比較一致。

當時改完,本機看一切正常,就 commit、push 上去了,根本沒注意到 git 其實沒抓到這次改名。

事後才知道,這是三個東西交織的結果:

  • Windows 檔案系統大小寫不敏感,Foofoo 是同一個資料夾。
  • Git on Windows 預設 core.ignorecase=true,會配合 Windows 的行為,這次的重新命名根本沒被當成一次 diff。
  • Cloudflare Pages 跑在 Linux 上,大小寫嚴格區分,/toeic-resources-2026//TOEIC-resources-2026/ 對它來說是兩個完全不同的網址。

於是,本機看起來沒事,repo 裡其實還是大寫,部署上去就只認大寫,小寫的 URL 全部 404。

解決問題

要讓 git「真的」承認這次改名,得從索引裡先把舊的拿掉,再加回新的:

git rm -r --cached public/blog/TOEIC-resources-2026
git add public/blog/toeic-resources-2026
git commit -m "Fix case: TOEIC-resources-2026 → toeic-resources-2026"
git push

--cached 只動 git 索引,不會碰到磁碟上的實體檔案。

未來怎麼防範

可以考慮把 git 設成大小寫敏感:

git config core.ignorecase false

之後任何資料夾或檔名只要改了大小寫,git status 就會老老實實顯示「舊名稱被刪除 + 新名稱新增」,不會再無聲無息地漏掉。

再順手跑了一下 git status 全域掃描,確認其他歷史檔案沒有同樣的漏網之魚。