免費授權的照片庫是好東西。我有 11 支作品的圖片來自同一個來源,每一筆都在資料檔裡記著名稱和網址。
某次改版要挑幾張當首圖,程式挑完卻只出現七張。我去看資料檔——十筆都在,欄位一個不缺。
資料檔長這樣 實際上 ────────────────────────────────────────── name: 有值 ✓ url: 有值 ✓ 但打開是 404 作者: 有值 ✓ 授權: 有值 ✓ ────────────────────────────────────────── 檢查程式看 4 個欄位有沒有值 → 全部通過
我以為發生了什麼
我以為網址壞掉會被發現。前端載入失敗總會留下什麼痕跡。
實際上前端寫了 onerror 就把那張圖安靜移除了——這是體貼的設計,也正因為體貼,十張變七張的時候畫面看起來完全正常。
實際發生了什麼
那個來源的縮圖網址裡,有一段兩碼的雜湊前綴目錄。2026-09-17 實測:
用官方 API 拿到的縮圖網址,下載回 200。同一個網址,我只把雜湊改錯一個字,立刻變 404。
而那段雜湊會變。原始檔案被重新上傳、改名,或縮圖快取被清過之後,舊網址就永久失效——但不會有任何通知,資料檔裡那一筆看起來還是好好的。
我那 11 支作品共用同一套做法,所以這不是一支的問題。
官方文件寫了嗎
沒有。文件會教你怎麼用 API 查一張圖的資訊,但不會特別警告「不要自己組網址」——因為從它的角度看,你本來就該用 API 拿。
自組網址這件事是我自己發明的捷徑:API 要多打一次請求,而網址規則看起來那麼有規律,照著拼就好了。規律是真的,只是那段雜湊不是規律的一部分,是查表來的。
你一定會踩的那個細節
問題的核心不是網址會爛,是我的檢查在檢查欄位,不是在檢查事實。
「每一筆都有 url」跟「每一筆的 url 都還能打開」是兩件事,而前者永遠會通過。任何資料檔只要當初寫入時是好的,這個檢查就永遠亮綠燈——它從此不會再抓到任何東西。
驗證連結活不活,只有一個方法,就是真的去打它:
定期對整批連結做一次健檢:
for 每一筆 url:
發一個 HEAD 請求,記下狀態碼
404 → 標記為待修,用官方 API 重新查一次正解
429 → 這是限流不是死連結,隔一陣子重試
(節流每秒一次,不然會把活的誤判成死的)
跑完印出「檢查 N 筆、死 M 筆」。
只印「檢查完成」的健檢等於沒跑。
最後一行是重點:任何檢查都要印出樣本數。印「全部通過」而不印數量的檢查,在資料是空的時候也會印「全部通過」。
站內延伸
來源: Wikimedia Commons api.php 的 imageinfo 取得官方縮圖網址,與 upload 端點實測,2026-09-17。
寫檢查的時候要問自己一句話:如果這件事真的壞了,我這個檢查會變成什麼樣子。答不出來,那就還不是檢查,只是一段會印綠字的程式。