# Cloudflare Worker

本頁說明 `worker/index.js` 如何在 Cloudflare 邊緣快取圖片，以及部署前需要修改的地方。

## 部署前設定

`handler` 以 `new URL(url.pathname, "[URL]")` 組出回源網址，`[URL]` 是佔位字串，部署前必須換成圖片伺服器的來源網址（例：`https://img-origin.example.com`），否則 `new URL` 會拋出例外。

## 處理範圍

| 路徑副檔名 | 行為 |
|---|---|
| `.jpg`、`.jpeg`、`.png`、`.webp`、`.svg`（不分大小寫） | 快取並回源 |
| 其他（含 `.avif`、`.pdf`、無副檔名） | 回 `400`，內容為 `400` |

判斷依據是**原始路徑**的副檔名，不是 `t` 參數；以 `t=avif` 讀取 `.jpg` 原檔仍會被處理。PDF 上傳後無法經由此 Worker 讀取。

## 快取行為

| 項目 | 行為 |
|---|---|
| 快取 key | 回源 URL（含全部 query 參數）；另加 `X-Custom-Cache-Key` 標頭記錄 query |
| 快取儲存 | `caches.default`，以 `event.waitUntil(cache.put(...))` 非同步寫入 |
| 有效期 | 回應覆寫為 `Cache-Control: public, max-age=604800`（7 天） |
| 診斷標頭 | `CF-Cache-Status: HIT`／`MISS`、`X-Query-String` |

回源時沿用原請求的方法與標頭，不檢查來源回應的狀態碼。

## 與 Nginx 的關係

Worker 回源到 Nginx，未命中時再由 Nginx 的 `proxy_cache` 與 Go 服務處理；四層命中順序見 [快取分層](/zh/caching)。
