OSS 实战指南:Bucket/外链/防盗链/计费与常见坑
介绍阿里云 OSS 对象存储的基础概念、计费方式及核心功能。涵盖 Bucket 创建、Object 管理、地域选择、访问域名配置等。重点讲解防盗链(Referer 白名单)、自定义域名(CNAME)绑定及日志记录机制。提供常见错误代码速查表,包括 403 Forbidden、签名不匹配、Endpoint 错误等问题的定位与修复方案,帮助开发者实现 OSS 的稳态运维与成本控制。

介绍阿里云 OSS 对象存储的基础概念、计费方式及核心功能。涵盖 Bucket 创建、Object 管理、地域选择、访问域名配置等。重点讲解防盗链(Referer 白名单)、自定义域名(CNAME)绑定及日志记录机制。提供常见错误代码速查表,包括 403 Forbidden、签名不匹配、Endpoint 错误等问题的定位与修复方案,帮助开发者实现 OSS 的稳态运维与成本控制。


阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。其数据设计持久性不低于 99.99xx%(12 个 9),服务设计可用性或者业务连续性不低于 99.995%。
我们可以使用阿里云提供的 API、SDK 接口或者 OSS 迁移工具轻松的将海量的数据移入或者移出到阿里云 OSS。数据存储到阿里云 OSS 之后,可以选择标准存储(Standard)作为移动应用、大型网站、图片分享或者热点视频的主要存储方式,也可以选择成本更低、存储期限更长的低频访问存储(Infrequent Access)和归档存储(Archive)作为不经常访问数据的存储方式。
OSS 具有与平台无关的 RESTful API 接口,可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。




阿里云对象存储 OSS 服务费用的各项组成部分及计费方式分为:按量计费和包年包月两种。
Bucket,存储空间是用户用于存储对象(Object)的容器,所有的对象都必须隶属于某个存储空间,存储空间具有各种配置属性,包括地域、访问权限、存储类型等。用户可以根据实际需求,创建不同类型的存储空间来存储不同的数据。
存储空间的命名规范如下:
Object,对象是 OSS 存储数据的基本单元,也被成为 OSS 的文件,对象由元信息(Object Meta),用户数据(Data)和文件名(Key)组成。对象由存储空间内部唯一标的 Key 来标识。 对象元信息是一组键值对,表示了对象的一些属性,比如最后修改时间、大小等信息,同时用户也可以在元信息中存储一些自定义的信息。
对象的生命周期是从上传成功到被删除为止,在整个生命周期内,只有通过追加上传的 Object 可以继续通过追加上传写入数据,其他上传方式上传的 Object 内容无法编辑,可以通过重复上传同名的实现对象的覆盖。
对象命名规范:
Region,表示 OSS 的数据中心所在物理位置,用户可以根据费用、请求来源等选择合适的地域创建 Bucket,一般来说,距离用户更近的 Region 访问速度更快。 Region 是在创建 Bucket 的时候指定的,一旦指定之后就不允许更改。该 Bucket 下所有的 Object 都存储在对应的数据中心,目前不支持 Object 级别的 Region 设置。
Endpoint,表示 OSS 对外服务的访问域名,OSS 以 HTTP RESTful API 的形式对外提供访问服务,当访问不同的 Region 的时候,需要不同的域名,通过内网和外网访问同一个 Region 所需要提供的 Endpoint 也是不同的。
AccessKey 指的是访问身份验证中用到的 AccessKeyId 和 AccessKeySecret。OSS 通过使用 AccessKeyId 和 AccessKeySecret 对称加密的方法来验证某个请求的发送者身份,AccessKeyId 用于标识用户,AccessKeySecret 是用户用于加密签名字符串和 OSS 用来验证签名字符串和密钥,必须保密。 对于 OSS 来说,AccessKey 的来源有:
OSS 提供给用户的虚拟空间,在这个虚拟空间中,每个用户拥有一个或者多个 Bucket。
使用阿里云管理控制台来完成 OSS 基本操作的流程如下:

我们登录到阿里云,找到:对象存储 OSS

创建 Bucket(我这里早几年之前已经创建过了):

根据你自己的情况选择(按默认的选择也可以):

我们进入之后,可以选择上传文件和下载文件:

如果一个 Bucket 设置成公开读权限,意味着允许其他用户来访问你的 object,你的 object 外链地址构成规则如下所示:
http:// <你的 bucket 名字>.<数据库中心服务域名>/<你的 object 名字>
构成规则的示意图如下:

假设这个 OSS 的数据在青岛,那 URL 就是:
http://oss-example.oss-cn-qingdao.aliyuncs.com/aliyun-logo.png
我们使用的时候,可以直接将 URL 链接放入到 HTML 中使用:
<img src="http://oss-example.oss-cn-qingdao.aliyuncs.com/aliyun-logo.png"/>
OSS 是按使用收费的服务,为了防止用户在 OSS 上的数据被其他人盗链,OSS 支持基于 HTTP header 中表头字段 referer 的防盗链方法。通过 OSS 控制台 - 权限管理 - 防盗链,可以对一个 Bucket 设置 referer 字段的白名单和是否允许 referer 字段为空的请求。
细节分析:
CNAME,OSS 支持用户将自定义的域名绑定到属于自己的 Bucket 上面,这个操作必须通过 OSS 控制台来配置。 按照中国互联网管理条例的要求,所有需要开通这项功能的用户,必须提供阿里云的备案号,域名持有者身份证等有效资料,经过阿里云审批通过才可以。
CNAM 场景:
OSS 为用户提供自动保存访问日志记录功能,Bucket 的拥有者可以通过 OSS 控制台的日志管理,为所拥有的 Bucket 开启访问日志记录功能,当一个 Bucket 开启日志记录的功能之后,OSS 自动访问这个 Bucket 的请求日志,以小时为单位,按照固定的命名规则,生成一个 Object 写入用户指定的 Bucket(目标 Bucket,Target Bucket)。
存储访问日志记录的 Object 命名规则:
<TargetPrefix><SourceBucket>-YYYY-mm-DD-HH-MM-SS-UniqueString
命名规则中,TargetPrefix 由用户指定,YYYY mm DD HH MM SS 分别是该 Object 创建时的阿拉伯数字的年、月、日、小时、分钟、秒,UniqueString 是由 OSS 系统生成的,一个实际的用于存储的 OSS 访问日志的 Object 名称例子如下:
MyLog-oss-example-2000-01-01-01-00-00-0000
日志的格式为:


细节分析:
http://oss-example.oss.aliyuncs.com/aliyun-logo.png http://oss-example.oss.aliyuncs.com/aliyun-logo.png?x-user=admin
OSS 处理上面两个请求,结果是一样的,但是在访问 Log 中,你可以通过 x-user=admin,很方便的定位出经过标记的这个请求。
| 症状 | 根因 | 定位 | 修复 |
|---|---|---|---|
| 403 Forbidden(匿名外链访问被拒) | Referer 不在白名单/不允许空 Referer | 控制台权限→防盗链;浏览器开发者工具查看请求头 | 白名单补充域名/允许空 Referer(慎用)或改用签名 URL |
| 403 AccessDenied(无法读对象) | Bucket 为 private 且请求未签名 | 控制台 ACL;服务端日志 | 生成服务端签名 URL 或改为 public-read(仅公开资源) |
| 403 SignatureDoesNotMatch | 客户端时间漂移/签名串计算错误 | 抓包比对 Authorization、Date | NTP 对时;复核 Canonical 头与路径编码 |
| 301 Moved Permanently 或 404 Not Found | 使用了错误的 Endpoint/Region | 控制台查看 Bucket 所在 Region;curl 目标域名 | 切换到正确区域 Endpoint;修正 SDK 配置 |
| 409 BucketAlreadyExists | 名称全局唯一被占用 | 创建返回码与请求 ID | 更换全局唯一名称(加入项目前缀/后缀) |
| 400 InvalidObjectName | Key 以 / 或 \ 开头或超长/非法字符 | SDK/服务端返回码 | 规范 Key 命名(UTF-8,1–1023 字节,不以斜线开头) |
| 自定义域名 404/证书异常 | CNAME 未生效/未绑定/证书未配置 | nslookup dig CNAME;浏览器证书链检查 | 完成控制台绑定与证书部署;等待 DNS 生效后再切流 |
| 下行费用异常激增 | 盗链或热点资源无缓存 | 访问日志分析 UA/来源;Referer 统计 | 启用防盗链;前置 CDN 缓存;限速/限域名 |
| NoSuchBucket/NoSuchKey | 拼写错误/对象被覆盖或生命周期删除 | 列表与日志核对 | 更正 Key;调整生命周期规则与版本控制 |
| 访问偶发超时/抖动 | 客户端重试/连接池未配置或网络波动 | SDK 指标与连接数 | 合理超时重试与连接池;就近 Region 与多可用区策略 |

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online