文件

快取分層

本頁說明同一張圖片在瀏覽器、Cloudflare Worker、Nginx 與本地快取檔四層各自的快取 key、有效期與失效方式。

四層總覽

層 快取 key 有效期 設定來源
瀏覽器 完整 URL 7 天(Cache-Control: public, max-age=604800 與 Expires) GetFromPath 標頭;Nginx 另加同值標頭
Cloudflare Worker 來源 URL + 完整 query string 7 天(max-age=604800) worker/index.js
Nginx proxy_cache 預設 key(含 query) 200/301/302/304 為 7 天,其他狀態 1 分鐘;30 天未存取即淘汰;上限 2 GB config/nginx/nodes.conf
本地快取檔 參數組成的檔名(見下節) 無期限,不會自動清除 GetFileCachePath()

本地快取檔命名

快取檔位於 storage/image/cache/,目錄結構對應 upload/,檔名去掉原副檔名後串接參數:

參數組合 檔名格式
有 s {名}_{s}_{q}_{b}_{B}.{t}
w 與 h {名}_{w}_{h}_{q}_{b}_{B}.{t}
只有 w {名}_{w}_auto_{q}_{b}_{B}.{t}
只有 h {名}_auto_{h}_{q}_{b}_{B}.{t}
皆無 {名}_auto_auto_{q}_{b}_{B}.{t}

各段使用請求中的原始字串,未正規化:?s=480&t=avif 產生 {名}_480___1.avif(q、b 為空字串,B 預設 1),而 ?s=480&t=avif&q=50 雖然輸出品質相同,卻會產生另一個快取檔。

命中順序

graph LR
    Req[請求] --> B{瀏覽器有效?}
    B -- 否 --> W{Worker 命中?}
    W -- 否 --> N{Nginx 命中?}
    N -- 否 --> L{本地快取檔存在?}
    L -- 否 --> V[libvips 轉檔並寫入快取檔]

未經 Worker 的請求從瀏覽器直接到 Nginx。.pdf、.svg 與 o=1 不寫本地快取檔,只由前三層快取。

失效與清除

程式沒有任何快取清除機制。刪除原檔只會把 upload/ 內的檔案移入回收桶,cache/ 內的轉檔結果仍在,且 GetFromPath 先查快取檔、後讀原檔,因此已刪除圖片的既有尺寸版本仍會持續回傳。需要立即下架時,須手動刪除 storage/image/cache/ 對應檔案,並清除 Nginx /var/cache/nginx/images 與 Cloudflare 快取。

EN