大小寫問題讓網站連結失效
· 閱讀時間約 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 檔案系統大小寫不敏感,
Foo跟foo是同一個資料夾。 - 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 全域掃描,確認其他歷史檔案沒有同樣的漏網之魚。