一、结论
接入S3做视频下载分发时配置CORS跨域权限,只需在存储桶的权限设置中添加匹配业务域名、请求方法的跨域规则,保存生效后即可允许前端站点直接调用存储桶内的视频资源,避免跨域报错。
二、准备工作
1. 已开通S3兼容对象存储服务的账号,且拥有存储桶的管理员操作权限
2. 用于存储视频的目标存储桶已创建,且待分发的视频文件已上传完成
3. 已明确需要访问视频资源的前端站点域名(包含协议、端口,例如https://www.example.com、http://localhost:3000)
4. 若通过API/CLI方式配置,需提前获取账号的AccessKey ID和AccessKey Secret
5. 若使用CDN加速分发,需同时拥有CDN控制台的配置权限
三、操作步骤
1. 进入存储桶的CORS配置页面
首先登录你使用的对象存储服务控制台,比如AWS S3控制台或者七彩云对象存储控制台,在存储桶列表中找到你用来存放分发视频的目标存储桶,点击进入存储桶详情页,在左侧菜单栏找到「权限配置」分类,下拉找到「跨域资源共享(CORS)」选项,点击进入配置页。如果是使用CLI工具,提前将工具的AccessKey、Endpoint、Region配置为当前存储桶对应的参数。
2. 编写并配置CORS规则
根据你的业务场景填写CORS规则,每个规则包含以下核心字段:
AllowedOrigins:允许跨域访问的源站地址,需要和实际访问的前端地址完全匹配,支持填写多个地址,测试环境可临时填*,生产环境建议只填写业务域名AllowedMethods:允许的HTTP请求方法,视频下载分发场景只需勾选GET、HEAD即可,若同时有上传需求可额外添加POST、PUT、DELETEAllowedHeaders:允许的请求头,一般填写*即可匹配所有合法请求头ExposeHeaders:允许前端读取的响应头,视频分发场景建议添加Content-Length、ETag、Accept-Ranges、Content-Range,方便前端获取视频时长、实现进度条拖拽和分片下载MaxAgeSeconds:预检OPTIONS请求的缓存时间,单位为秒,建议填写86400(1天),减少重复预检请求的开销
如果是控制台可视化配置,直接按页面提示填写对应字段即可;如果是用CLI/API配置,需要将规则整理为标准JSON格式,再调用配置接口。以AWS CLI为例,将规则保存为cors.json文件后,执行如下命令即可完成配置:
```bash
aws s3api put-bucket-cors --bucket 你的存储桶名称 --cors-configuration file://cors.json --endpoint-url 对应服务的Endpoint地址
```
3. 保存规则并验证生效
填写完规则后点击保存,一般1-2分钟即可全局生效。验证方式有两种:一是直接打开前端站点,点击视频播放或下载按钮,看浏览器控制台是否还有跨域相关报错;二是用curl命令模拟跨域请求,执行命令:
```bash
curl -H "Origin: 你的前端域名" -H "Access-Control-Request-Method: GET" -I https://你的存储桶访问域名/视频路径.mp4
```
如果返回结果中包含Access-Control-Allow-Origin: 你的前端域名字段,说明配置已经生效。
四、常见错误
- Endpoint填写错误:使用非原生S3服务时,需要填写对应服务商提供的Endpoint,比如七彩云对象存储的Endpoint为对应区域的专属地址,误填AWS官方Endpoint会导致配置失败
- Region不匹配:存储桶所属区域和配置时填写的Region代码不一致,会导致无法找到存储桶,配置请求报错
- 权限不足:操作账号只有存储桶的读权限,没有CORS配置权限,会提示无操作权限,需要联系管理员开通对应权限
- 源站地址匹配错误:
AllowedOrigins填写的地址和实际访问的地址协议(http/https)、端口、域名不一致,比如漏填测试环境的端口号、多写了末尾的斜杠,都会导致跨域报错 - 响应头配置缺失:
ExposeHeaders没有添加Content-Range等字段,会导致前端无法实现视频分片加载和进度条拖拽 - 浏览器缓存问题:配置前已经访问过站点,浏览器缓存了旧的跨域规则,需要清空缓存或者用无痕模式测试才能看到效果
- JSON格式错误:通过API/CLI配置时,规则的JSON格式存在语法错误,比如少了括号、逗号,会导致配置提交失败
五、示例说明
假设你的业务有PC端站点https://www.example.com和移动端站点https://m.example.com,只需要提供视频下载和在线播放服务,对应的CORS规则JSON如下:
```json
{
"CORSRules": [
{
"AllowedOrigins": ["https://www.example.com", "https://m.example.com"],
"AllowedMethods": ["GET", "HEAD"],
"AllowedHeaders": ["*"],
"ExposeHeaders": ["Content-Length", "ETag", "Accept-Ranges", "Content-Range"],
"MaxAgeSeconds": 86400
}
]
}
```
这个规则的作用是仅允许PC和移动端的官方站点发起GET、HEAD请求获取视频资源,允许前端读取视频长度、分片范围等元数据,预检请求缓存1天,完全满足普通视频下载分发场景的需求,同时避免了不必要的权限开放。如果是在七彩云对象存储控制台配置,直接选择「音视频分发」预设模板,填入业务域名后一键保存即可生成上述规则,无需手动编写JSON。
六、更简单的方案
如果觉得原生AWS S3的配置流程繁琐、国内访问延迟高、带宽成本高,也可以选择兼容S3 API的对象存储服务简化流程。比如七彩云对象存储完全兼容S3协议,现有基于S3 SDK开发的业务代码无需任何修改即可直接迁移接入,控制台针对常见业务场景提供了预设的CORS规则模板,除了音视频分发模板外,还有网页静态资源、上传下载等场景模板,新手只需选择对应模板填入业务域名即可完成配置,无需手动梳理每个字段的含义。同时七彩云对象存储国内节点覆盖全,下行带宽成本远低于海外S3服务,还自带基础的防盗链、流量监控功能,更适合国内业务做视频下载分发。
七、FAQ
1. 配置完CORS之后还是提示跨域错误怎么办?
首先检查CORS规则中的AllowedOrigins字段是否和当前访问的前端地址完全一致,包括协议头、端口号,不要多填末尾的斜杠;其次检查存储桶是否开启了防盗链配置,需要将你的业务域名添加到防盗链白名单中;如果使用了CDN加速,需要确认CDN侧是否开启了CORS配置,或者配置CDN回源获取存储桶的CORS规则,同时清理CDN的缓存后再测试。
2. 生产环境可以把AllowedOrigins设置为*吗?
不建议。将AllowedOrigins设置为*意味着所有站点都可以跨域访问你的存储桶资源,很容易被恶意站点盗刷流量,产生不必要的成本支出。生产环境建议仅填写你实际使用的业务域名,多个域名可以按数组格式添加到AllowedOrigins列表中。
3. 视频拖拽进度条或者分片下载失败和CORS有关吗?
大概率有关。如果CORS规则中的ExposeHeaders没有添加Accept-Ranges和Content-Range字段,前端JS就无法读取到响应头中的分片范围信息,会导致分片下载请求失败,无法实现拖拽进度条的功能,只需在ExposeHeaders中添加这两个字段即可解决问题。
4. 多个不同业务域名需要访问同一份视频资源怎么配置?
直接在AllowedOrigins数组中添加所有需要授权的域名即可,比如["https://a.example.com", "https://b.example.com", "https://www.test.com"],最多支持配置100个域名,完全满足大多数业务的需求。
八、总结
接入S3做视频下载分发配置CORS跨域权限的核心流程是:先明确业务的访问域名和请求场景,再进入存储桶的CORS配置页填写对应规则,保存后验证生效即可。对于新手来说,如果不想手动梳理每个配置字段,可以优先选择七彩云对象存储这类兼容S3的服务,使用预设模板快速完成配置,降低配置出错的概率。上线前建议在PC、移动端等不同终端测试视频播放、下载、进度条拖拽等功能,确认没有跨域问题后再正式对外提供服务,同时注意生产环境不要开放不必要的权限,避免资源被盗用产生额外成本。
需要稳定、兼容 S3 的对象存储?
七彩云对象存储适合图片、视频、大文件下载、静态资源托管和开发者接入。
访问七彩云官网