最近看到一篇用 Cloudflare R2 做圖片託管的教學,方向是對的:對部落格、小工具文件、靜態網站來說,R2 確實是很舒服的物件儲存選項。但我會想補一篇最新版,是因為「免費圖床」這四個字很容易讓人誤會。
R2 的強項是 免流量費、有免費額度、可以接自訂網域,也能用 S3 相容工具管理檔案。可是它仍然會計算儲存量與操作次數;圖片如果真的爆量,讀取請求也可能變成帳單來源。
這篇用 2026-07-08 查到的 Cloudflare 官方文件為準,整理一個比較適合部落格圖片託管的設定方式。
先看清楚 R2 免費額度
Cloudflare R2 的計費不是只有容量,而是由儲存量與操作次數組成。以 Standard storage 來看,官方文件列出的免費額度是:
| 項目 | 每月免費額度 |
|---|---|
| 儲存空間 | 10 GB-month |
| Class A 操作 | 1,000,000 次 |
| Class B 操作 | 10,000,000 次 |
| Egress 流量 | 免費 |
這裡有兩個重點。
第一,免費額度只適用於 Standard storage,不適用於 Infrequent Access storage。做圖片託管時,除非你很確定取用頻率與成本模型,不然先選 Standard 比較單純。
第二,圖片被讀取會算 Class B 操作。R2 不收 egress 流量費,但大量圖片請求仍然可能超過免費 Class B 額度。Cloudflare 官方的資產託管範例也提醒,如果每天有大量讀取,即使容量很小,Class B 操作仍可能產生成本。
所以比較準確的說法不是「R2 是無限免費圖床」,而是:小型部落格、文件站、個人作品集通常很容易落在免費額度內,但還是要看請求量。
架構建議:R2 加自訂網域
R2 bucket 預設是 private。要把圖片當成公開資源使用,主要有兩條路:
| 方式 | 適合情境 | 注意事項 |
|---|---|---|
r2.dev 公開開發網址 | 測試、臨時預覽 | 官方標示為 development traffic,且有 rate limit |
| 自訂網域 | 正式圖片託管 | 可以搭配 Cloudflare cache、Access、WAF 等功能 |
如果是正式部落格,我會直接接自訂網域,例如:
img.example.comassets.example.comcdn.example.comCloudflare 官方文件也寫得很明確:若要使用存取管理、快取、bot 管理等功能,公開 bucket 時需要設定自訂網域。r2.dev 適合開發測試,不適合拿來當正式圖片 CDN。
設定流程
以下流程假設你已經有 Cloudflare 帳號,且網域也在同一個 Cloudflare 帳號裡管理。
Step 1:建立 Bucket
到 Cloudflare Dashboard:
- 進入 R2 Object Storage。
- 建立新的 bucket。
- 選擇 Standard storage。
- bucket 名稱建議用小寫與連字號,例如
zeroone-images。
命名時我會避開空格、中文與太有情緒的名字。之後如果要接 CLI、同步工具或自動化流程,簡單的 key 會少很多麻煩。
Step 2:連接自訂網域
在 bucket 的設定頁面找到 Custom Domains,加入你要使用的子網域,例如:
img.example.comCloudflare 會引導你確認 DNS record。等狀態變成 Active 後,就可以用:
https://img.example.com/posts/example/cover.webp這種網址格式來引用圖片。
Step 3:先用 Dashboard 上傳測試圖
第一次設定時,不要急著寫自動化。先用 Dashboard 上傳一張測試圖,例如:
test/hello.webp然後用瀏覽器打開:
https://img.example.com/test/hello.webp如果看得到圖片,再檢查 response header:
curl -I https://img.example.com/test/hello.webp你要確認至少三件事:
- HTTP status 是
200。 content-type正確,例如image/webp。- 快取相關 header 符合你的預期。
Step 4:用 Wrangler 或 rclone 上傳
少量圖片可以用 Dashboard。大量圖片、文章封面或自動化部署,建議改用 CLI。
Wrangler 適合單檔上傳:
wrangler r2 object put zeroone-images/posts/r2-guide/cover.webp --file=cover.webpCloudflare 官方文件提醒,Wrangler 上傳單檔有大小限制,且一次只能處理一個 object。若要同步整個資料夾,rclone 會比較適合:
rclone copy ./public-images r2:zeroone-imagesrclone ls r2:zeroone-images如果你已經有使用 S3 SDK 或 AWS CLI 的流程,R2 也提供 S3 相容 API。重點是 endpoint 要換成 Cloudflare R2 的 endpoint,region 通常使用 auto。
圖片路徑怎麼整理
做部落格圖片託管時,我會用這種結構:
posts/ sakana-translate/ cover.webp screenshot-01.webp cloudflare-r2-image-hosting/ cover.webp dashboard.webpshared/ avatars/ logos/路徑規則比工具更重要。圖片一多,真正麻煩的不是上傳,而是你半年後不知道哪張圖還在用。
幾個習慣可以先定好:
- 檔名只用小寫英文、數字、連字號。
- 封面固定叫
cover.webp。 - 截圖用
screenshot-01.webp這種序號。 - 已發布文章的圖片不要覆蓋同名檔,除非你知道快取怎麼清。
如果圖片內容會更新,我會用版本化檔名:
dashboard-2026-07.webp這比每次更新後到處 purge cache 更直覺。
快取設定不要漏掉
R2 接自訂網域後,可以透過 Cloudflare Cache 讓圖片從 edge 回應,降低回源到 R2 的頻率。這對圖片託管很重要,因為讀取 R2 object 會算 Class B 操作。
實務上可以先做兩件事:
- 上傳圖片時設定合理的
Cache-Control。 - 在 Cloudflare 針對圖片路徑建立 Cache Rule。
例如已經版本化、不會被覆蓋的圖片,可以使用較長快取:
Cache-Control: public, max-age=31536000, immutable但如果你會覆蓋同一個檔名,例如永遠覆蓋 cover.webp,那就不要把快取時間拉太長,否則更新後會看到舊圖。
我的偏好是:檔名版本化,快取拉長;檔名固定,快取保守。
什麼情況不適合用 R2 當圖床
R2 很適合部落格圖片,但不是所有圖片場景都適合。
如果你需要的是圖片轉檔、縮圖、裁切、水印、自動壓縮,R2 本身不是圖片處理服務。你可能還要搭配 Cloudflare Images、Workers,或自己的圖片處理 pipeline。
如果你的圖片需要私有授權、短效連結、防盜鏈、使用者權限控管,也不要只靠「不要公開連結」這種做法。要改用 signed URL、Workers、Access 或其他權限層。
如果你只是臨時貼圖,且完全不想管理網域、快取、路徑和備份,傳統圖片服務反而比較省心。
發布前檢查清單
正式把 R2 當圖片託管前,我會檢查這些:
- Bucket 使用 Standard storage。
- 正式網址使用自訂網域,不使用
r2.dev。 - 圖片路徑有固定規則。
- 本機或 Git repo 仍保留原始圖片備份。
curl -I檢查 content type 與 cache header。- Cloudflare Billing 或 R2 Metrics 有定期看。
- 大量圖片上傳使用 rclone 或 S3 相容工具,不靠手動拖拉。
R2 最適合的定位,是「可控、便宜、能自動化的圖片物件儲存」。把它當成無限免費圖床,反而容易忽略請求成本、快取與備份。
常見問題
Q: Cloudflare R2 圖片託管真的免費嗎?
A: 小型部落格很可能落在免費額度內,但不是無限制免費。R2 Standard storage 每月有 10 GB-month、100 萬次 Class A、1,000 萬次 Class B 免費額度,egress 免費。超過免費操作次數或儲存量仍會依官方價格計費。
Q: 可以直接用 r2.dev 當正式圖片網址嗎?
A: 不建議。Cloudflare 官方把 r2.dev 公開網址定位為 development traffic,且有 rate limit。正式圖片託管建議接自訂網域,才能搭配 Cloudflare cache、存取管理與安全產品。
Q: R2 會自動幫圖片壓縮或產生縮圖嗎?
A: R2 是物件儲存服務,不是圖片處理服務。它負責存檔與提供物件存取;如果你需要壓縮、轉 WebP、裁切或產生多尺寸圖片,要在上傳前處理,或另外搭配 Cloudflare Images、Workers 或自己的處理流程。
參考資料:
Cloudflare R2 Wrangler commands
回報錯字、失效連結,或告訴我你想看的延伸主題。