防止阿里云oss被刷

本文适用于把图片放在对象存储(阿里云 OSS、Backblaze B2 等)并开启公开读的场景。你会学到:隐藏 bucket 特征(文件列表、响应标头)、配置错误页,以及通过 Cloudflare 缓存规则降低被刷成本。

S3 协议的 bucket 在公开读的权限下会默认展示桶内文件列表和路径,特征明显而且并不友好。

隐藏Bucket特征

设置错误页

绝大多数的对象存储都支持设置静态网站 index.html 和错误页 404.html 的设置,比如阿里云 OSS 在【基础设置】-【静态页面】下。这里随手找了两个单页供选择和参考(点击前往)。

img

显然,像 B2 这种简单粗暴的又一次是没有这样的功能,可以如图使用 URL 重写规则将主页静态定向至 index.html。404 页面的功能没有一个比较好的办法,不过 B2 的友好访问链接不会展示目录列表和 bucket 信息,影响并不大。

img

隐藏bucket标头

在对象存储的标头中会包含有一些 bucket 信息,可以通过控制台的 Network 选项卡暴露出来,也是对对象存储特征的一个暴露点。

img

通过 CloudFlare 转换规则中的【修改响应头】,能够简单地实现响应头的去除,同时还可以加入跨域请求头等需要的标头。

img

目前 B2 和 OSS 可以隐藏的标头大致如下,其他对象存储请根据实际情况去查看和配置,在此就不一一列出了。

阿里云OSSBackblaze B2
x-oss-hash-crc64ecmax-bz-content-sha1
x-oss-object-typex-bz-file-id
x-oss-request-idx-bz-file-name
x-oss-server-timex-bz-info-src_last_modified_millis
x-oss-storage-classx-bz-upload-timestamp

配置缓存规则

通过 Cloudflare 配置对象存储的缓存规则,命中缓存的请求不会回源,从而减少被刷时的源站费用:

image-20250610033620099

image-20250610033644237

image-20250610033658182

image-20250610045928221

验证与自查

  1. 浏览器直接访问 bucket 域名根路径,显示的是 index.html 而非文件列表
  2. 访问一个不存在的路径,返回的是自定义 404.html
  3. 浏览器 DevTools → Network 检查响应头,x-oss-* / x-bz-* 标头已消失
  4. 同一图片二次访问时命中 Cloudflare 缓存(响应头出现 cf-cache-status: HIT

参考