作为一个前端开发者,图床就像后勤补给站。我曾以为 GitHub + jsDelivr 是白嫖的终点,也曾幻想国内云厂商的免费额度能让我躺平。但在 2026 年,被现实反复毒打之后,最终找到了真正靠谱的方案——Cloudflare R2


那些年踩过的图床坑

国内免费存储的备案墙

我试过多吉云 (DogeCloud),贪它那 20GB 的国内极速流量。

测试域名有效期只有 30 天,限制极多。国内云服务的尽头终究是 ICP 备案,没有备案域名就只能在试用期里转圈。

GitHub + jsDelivr 的抽风问题

这是最经典的方案,也是最容易踩坑的。jsDelivr 节点在国内经常处于半残状态,稳定性看天吃饭。GitHub 是用来存代码的,仓库大了还会被官方警告のだ。


为什么选 Cloudflare R2?

对比了阿里云 OSS、腾讯云 COS 和各类第三方图床之后,选 R2 的理由很直接:

  • 每月 10GB 免费存储,极高的 B 类操作额度,对个人博客来说基本够用。
  • 绑自己的域名,全球 CDN。国内直连一般,但配合 Cache Everything 规则,边缘节点缓存后基本能秒开。
  • 兼容 S3 协议PicGoRcloneAList 直接对接,无需额外适配。

迁移过程的几个连环坑

路径匹配问题

把 GitHub 仓库改私有、换 R2 域名之后,博客图片全炸了。原因很直接:旧文章路径里带着 /gh/username/repo/ 这种 GitHub 专属后缀。解法要么用 VS Code 全局替换路径,要么在 Cloudflare 后台写一条 Transform Rule 做 URL 重写。

RaiDrive 的收费陷阱

想像本地硬盘一样管理 R2,装了 RaiDrive——结果增删改查要开 VIP。直接换 WinFsp + Rclone,配合 --vfs-cache-mode full 参数,本地操作体验和真硬盘差不多,完全免费。


我的配置方案

  • 存储:Cloudflare R2(亚太地区机房)
  • 分发:R2 自定义域名 + Tiered Cache(分层缓存)+ HTTP/3
  • 缓存规则:强制 Edge Cache TTL 为 1 个月,图片死在边缘节点上加速
  • 管理:Rclone 挂载为本地 Z: 盘,写完博客直接拖拽上传

小结

图床的核心不是堆方案,是减少麻烦。减少不必要的国内分流,减少复杂的同步 Actions,减少对云厂商”免费试用”的依赖。R2 + 强力缓存这套组合,目前来看最省心。

后记:如果你还在 GitHub 的泥潭里挣扎,迁移成本不高,但省掉的心力不少 😅


硬核实操:从零配置 R2 工具链

第一阶段:Cloudflare R2 开荒

  1. 登录 Cloudflare 控制台,进入 R2 → Create bucket。名字随意(比如 blog-img),位置选 Automatic。

  2. 回到 R2 概览页,点右侧的 Manage R2 API Tokens → Create API token,权限选 Edit。

    生成后立刻保存 Access Key IDSecret Access Key,关了页面就永远消失了。

  3. 在桶的 Settings 里绑你的域名(比如 img.yourdomain.love)。

    CORS 不配会 403。在 CORS 策略里填:

    1
    2
    3
    4
    5
    6
    7
    [
    {
    "AllowedOrigins": ["*"],
    "AllowedMethods": ["GET", "POST", "PUT"],
    "AllowedHeaders": ["*"]
    }
    ]

第二阶段:Rclone 挂载

  1. rclone.org 下载,把 rclone.exe 路径加到环境变量。

  2. 打开 PowerShell,输入 rclone config,按以下顺序操作:

    1. n — New remote
    2. name:输入 r2
    3. Storage:选 s3
    4. provider:选 Cloudflare
    5. env_auth:输入 false
    6. access_key_id:填 R2 Access Key
    7. secret_access_key:填 R2 Secret Key
    8. region:输入 auto
    9. endpoint:填 S3 API 地址(格式 https://<account_id>.r2.cloudflarestorage.com
    10. location_constraint:回车
    11. acl:回车
    12. Edit advanced config:n
    13. Keep this remote:y
    14. q 退出
  3. 挂载命令:

    1
    rclone mount r2:blog-img Z: --vfs-cache-mode full --cache-dir "C:\r2cache" --vfs-read-chunk-size 128M --vfs-read-chunk-size-limit off --header "Referer:https://www.lolimama.love/"

    参数说明:

    • r2:blog-img:配置名 + 桶名
    • Z::挂载盘符
    • --vfs-cache-mode full:本地缓存层,增删改查不会因网络波动卡死
    • --cache-dir:缓存路径
  4. 把挂载命令写成 .bat 文件,丢进 shell:startup 启动文件夹。

    .bat 那一下闪烁都不想看的话,可以用 VBScript 包裹:

    1
    2
    Set ws = CreateObject("Wscript.Shell")
    ws.run "cmd /c C:\你的路径\mount_r2.bat", vbhide

    另存为 silent_mount.vbs,放进 shell:startup,把 .bat 从里面移走。开机后 Z: 盘会直接出现。


附加建议

国内速度慢的话,在 Cloudflare 的 Caching 页面开启 Tiered Cache,边缘节点会互相缓存,能快一些。

防盗链:在 WAF 里设规则,只允许来自你博客的 Referer 访问图片。

挂载窗口关掉后盘就消失了。建议用 nssm 把 Rclone 封装成系统服务,开机自启才算真正稳定。