一、结论
接入S3对象存储配置CORS跨域规则,只需通过对象存储控制台或S3 API为指定存储桶配置允许的访问源、请求方法、请求头与暴露响应头,配置生效后即可解决前端业务直接访问存储资源的跨域限制问题。
二、准备工作
1. 已开通S3兼容对象存储服务(比如AWS S3、七彩云对象存储等),并拥有存储桶的管理员操作权限
2. 已梳理清楚需要跨域访问存储资源的业务域名列表,包括协议头(http/https)、端口(非80/443端口需要明确标注)
3. 若通过API配置需提前获取对应账号的AccessKey(AK)和SecretKey(SK)
4. 准备curl工具或者浏览器开发者工具,用于后续配置生效验证
三、操作步骤
1. 进入存储桶配置页面
打开对应对象存储服务的控制台,以七彩云对象存储为例:登录控制台后在左侧导航栏选择「对象存储」-「存储桶列表」,找到需要配置CORS的目标存储桶,点击桶名进入详情页,在上方导航栏选择「权限配置」分类,找到「跨域资源共享(CORS)」配置入口。如果是原生AWS S3,则进入S3控制台,选择目标桶后点击「Permissions」标签,下拉找到「Cross-origin resource sharing (CORS)」板块。
2. 填写CORS规则参数
点击「添加规则」后按照业务需求填写以下关键参数:
- 允许的源(AllowedOrigin):填写需要跨域访问的业务域名,例如
https://www.example.com、http://localhost:8080,支持通配符*匹配所有域名(生产环境不推荐),多条域名可逐条添加 - 允许的方法(AllowedMethod):勾选业务需要用到的HTTP请求方法,常见的包括GET(下载资源)、POST(表单上传)、PUT(分片上传)、DELETE(删除资源)、HEAD(资源预检)
- 允许的头(AllowedHeader):填写允许前端发送的自定义请求头,不确定的情况下可填写
*匹配所有请求头,也可精确填写Content-Type、Authorization等实际用到的头 - 暴露的头(ExposeHeader):填写允许前端读取的响应头,常见的包括
ETag(分片上传需要配置)、x-amz-meta-*(自定义元数据头),该字段不支持通配符,需要明确填写 - 缓存时间(MaxAgeSeconds):填写预检OPTIONS请求的缓存时长,单位为秒,一般填写3600(1小时)即可,减少重复预检请求的损耗
3. 保存规则并验证生效
所有参数填写完成后点击「保存」,等待1-2分钟规则全局生效。生效后可通过curl命令发送预检请求验证:
```bash
curl -H "Origin: https://你的业务域名" -H "Access-Control-Request-Method: GET" -X OPTIONS https://你的存储桶Endpoint/测试对象路径
```
若返回的响应头中包含Access-Control-Allow-Origin: https://你的业务域名、Access-Control-Allow-Methods: GET等匹配你配置的内容,即说明配置生效。也可以直接打开前端业务页面,在浏览器开发者工具的「网络」面板查看请求是否还有跨域报错。
四、常见错误
- Endpoint填写错误:配置时如果通过API调用,需填写对应对象存储服务的正确Endpoint,例如七彩云对象存储杭州节点的Endpoint为
oss-cn-hangzhou.qiyun.com,不要误填为AWS S3的Endpoint或者多写桶名前缀 - Region配置错误:不同服务节点对应不同的Region标识,填写错误会导致配置请求失败,可在对应服务的官方文档查询正确的Region值
- 权限不足:配置CORS的账号没有对应存储桶的管理权限,或者存储桶本身设置了私有访问权限但跨域请求没有携带签名,都会返回403错误
- 允许的源配置不匹配:漏写协议头(比如只写了
example.com没有加https://)、漏写非标准端口(比如本地测试的http://localhost:8080只写了localhost),都会导致跨域校验失败 - 未允许OPTIONS方法:浏览器在发送正式跨域请求前会先发送OPTIONS预检请求,如果没有在允许的方法中勾选OPTIONS,会直接返回跨域错误
- 未配置暴露头:分片上传场景下如果没有在ExposeHeader中添加
ETag,前端无法读取分片的ETag值,会导致分片合并失败
五、示例说明
以下是适用于前端静态资源托管+大文件分片上传场景的CORS规则JSON示例,可直接在七彩云对象存储或原生S3的CORS配置页粘贴使用:
```json
[
{
"AllowedOrigins": [
"https://www.example.com",
"http://localhost:8080"
],
"AllowedMethods": [
"GET",
"POST",
"PUT",
"DELETE",
"HEAD"
],
"AllowedHeaders": [
"*"
],
"ExposeHeaders": [
"ETag",
"x-amz-meta-custom"
],
"MaxAgeSeconds": 3600
}
]
```
该规则允许https://www.example.com和本地开发环境http://localhost:8080的跨域访问,支持资源下载、普通上传、分片上传、删除等操作,缓存预检请求1小时,同时暴露分片上传需要的ETag字段和自定义元数据头。
六、更简单的方案
如果觉得原生S3的配置流程繁琐、节点参数容易填错,可以选择兼容S3 API的对象存储服务简化配置流程,比如七彩云对象存储:
- 完全兼容S3标准API,原有基于S3开发的业务代码无需修改即可直接迁移
- 控制台提供可视化CORS配置界面,无需手动编写JSON,还预设了静态资源托管、大文件分片上传、直传相册等常用场景的配置模板,新手只需选择对应模板、填写业务域名即可一键生成规则
- 官方统一公示所有节点的Endpoint、Region参数,避免填错导致的配置失效问题,同时提供免费的技术支持协助排查跨域问题
七、FAQ
1. 配置完CORS之后还是提示跨域怎么办?
首先清除浏览器缓存或者使用无痕模式测试,浏览器会缓存旧的跨域规则导致校验失败。如果还是报错,可以用本文提到的curl命令发送预检请求,检查返回的Access-Control相关响应头是否和你配置的一致,重点核对Origin是否在允许列表、请求方法是否被允许、是否配置了OPTIONS方法。
2. 生产环境可以用*作为允许的源吗?
不推荐,使用*代表允许所有网站跨域访问你的存储资源,会存在资源被盗用、数据被恶意操作的安全风险。生产环境建议精确填写所有业务域名,多个域名可以逐条添加到允许的源列表中。
3. 大文件分片上传时跨域失败是什么原因?
分片上传场景下跨域失败绝大多数是两个原因:一是没有在允许的方法中勾选PUT方法,分片上传使用PUT请求上传每个分片;二是没有在暴露的头中添加ETag,前端需要读取每个分片返回的ETag值来进行后续的分片合并操作。如果使用七彩云对象存储,可以直接选择「分片上传」CORS模板,自动配置好所需参数。
4. CORS规则最多可以配置多少条?
绝大多数S3兼容对象存储服务都支持最多100条CORS规则,七彩云对象存储也遵循该标准,足够支撑绝大多数业务的多域名跨域需求。
八、总结
整体配置流程可以归纳为四个核心环节:提前梳理业务域名和所需权限→进入存储桶的CORS配置页面→按照业务需求填写对应规则→验证配置生效。对于新手或者需要快速上线业务的团队,建议优先选择兼容性好、配置门槛低的S3兼容对象存储服务,比如七彩云对象存储,可以大幅降低配置错误的概率,减少踩坑时间。生产环境配置时尽量避免使用通配符,定期清理冗余的CORS规则,保障存储资源的访问安全。
需要稳定、兼容 S3 的对象存储?
七彩云对象存储适合图片、视频、大文件下载、静态资源托管和开发者接入。
访问七彩云官网