前言

Cloudflare R2 这东西,我用了一年多了,最大的感受就两个字——真香。存储便宜,流量不要钱,特别适合我这种喜欢拍视频又舍不得买大带宽服务器的。

但 R2 有个坑:直接拿它默认的 .r2.dev 域名用,速度慢得离谱,还动不动触发限流。踩过这个坑之后,我摸索了一套让它真正"好用"的方案,今天分享出来。

第一步:绑定自定义域名

这一步是必须的,别偷懒。默认的 .r2.dev 域名只配用来做开发测试,平时用真心不行。

操作很简单:

  • 进 Cloudflare 控制台,找到你的 R2 存储桶
  • 设置 → 自定义域名 → 绑定一个托管在 Cloudflare 的域名(比如 res.yourdomain.com

绑完以后,所有请求都会自动走 Cloudflare 的全球 CDN 节点,速度直接从"拖拉机"变成"高铁"。

第二步:配置缓存规则

绑了域名不等于万事大吉。Cloudflare 默认不会缓存所有媒体文件,你不动手配一下,每次访问还是回源,白费了 CDN 的优势。

进 Cloudflare 控制台 → 缓存 → 缓存规则,新建一条规则:

  • 字段选 URI Path,包含 .mp4(图片的话再加 .jpg.png
  • 或者直接匹配主机名等于你绑的 R2 子域名
  • 缓存设置选「符合缓存条件」,边缘缓存 TTL 设一个月

媒体文件一般不常改,缓存一个月完全没问题。设好之后,用户第一次访问会回源拉取,之后就是边缘节点直出,秒开。

第三步:视频的流式播放优化

图片还好,视频才是大头。视频文件大,用户还喜欢拖进度条,搞不好就很卡。

好消息是 R2 原生支持 Accept-Ranges: bytes,也就是 HTTP Range Requests。用 HTML5 的 <video> 标签直接播放,浏览器会自动请求视频片段,实现边下边播,拖动进度条也没问题。

如果视频特别大(几个 G 的高清长视频),建议上传前用 FFmpeg 转码切片成 HLS(.m3u8)格式,配合 hls.js 播放器,能做到自适应码率。不过大多数情况直接传 MP4 就够用,别过度折腾。

第四步:搭建观看界面

R2 只是个仓库,你还需要个架子来展示。我试过几种方案:

方案 A:AList(最推荐)

用 Docker 部署一个 AList,通过 S3 协议挂载 R2。它自带文件管理、图片画廊、视频播放器,界面还挺好看。配好之后跟浏览本地网盘一样,手机上也能直接看。

方案 B:已有博客直接引用

像我现在用的 Typecho,直接插 HTML 就完事:

<video controls preload="metadata" width="100%">
  <source src="https://你的自定义域名/video.mp4" type="video/mp4">
</video>
<img src="https://你的自定义域名/photo.jpg" alt="照片">

方案 C:Cloudflare Workers 纯 Serverless

如果你像我一样有台甲骨文 ARM 闲着也是闲着,可以直接用 Workers 绑定 R2,写个简单脚本动态生成页面。不需要 VPS,完全 Serverless。

总结

核心就两步:绑定自定义域名 + 配好 Cache Rules。搞定了这两件事,R2 就直接从"测试工具"变成"生产级媒体存储"了。

至于前端展示,看你个人习惯。喜欢省事的用 AList,喜欢折腾的写 Workers,跟我一样有博客的直接内嵌 HTML 标签,哪种都行。

文章目录