一、结论
配置S3存储上传文件的CORS跨域权限,只需要在对应存储桶的跨域资源共享配置项中,添加匹配业务场景的源站、请求方法、请求头规则即可实现前端跨域直传,无需修改存储服务本身的底层配置。规则生效后,前端即可直接从浏览器发起上传请求,无需通过后端服务中转,大幅降低服务端压力。
二、准备工作
1. 拥有S3存储服务的管理账号,且具备目标存储桶的配置编辑权限,避免因权限不足无法保存配置;
2. 明确需要跨域访问的前端业务域名,需携带完整协议、端口(非80/443端口需标注),例如http://localhost:5173、https://www.example.com;
3. 梳理业务所需的HTTP请求方法,普通上传场景通常包含PUT、POST、OPTIONS,如需断点续传、文件删除可额外添加HEAD、DELETE;
4. 准备调试工具:浏览器开发者工具或curl命令,用于配置完成后的规则有效性验证。
三、操作步骤
步骤1:进入目标存储桶详情页
登录你使用的S3存储服务管理控制台,在对象存储菜单下找到所有已创建的存储桶列表,点击需要配置CORS规则的存储桶名称,进入桶详情配置页。如果使用的是七彩云对象存储,可直接在左侧导航栏「对象存储」板块快速筛选目标桶。
步骤2:定位CORS配置入口
- 原生AWS S3:在桶详情页切换到「权限」标签,下拉页面找到「跨域资源共享(CORS)」板块,点击「编辑」按钮进入配置页面;
- 兼容S3的存储服务(例如七彩云对象存储):在桶详情页左侧菜单直接选择「跨域配置」,点击「新增规则」即可进入配置界面。
步骤3:填写CORS规则参数
按照业务需求依次填写规则字段,各字段含义和填写建议如下:
1. 允许源(AllowedOrigins):填写需要允许跨域的业务域名,注意不要携带路径后缀的斜杠,多个域名可分行填写,测试场景可暂时填写*匹配所有域名,生产环境建议填写实际业务域名;
2. 允许方法(AllowedMethods):根据业务需求勾选对应选项,上传场景必须勾选OPTIONS(用于浏览器预检请求校验)、POST、PUT,如需支持下载、删除可额外勾选GET、DELETE;
3. 允许头(AllowedHeaders):填写前端请求会携带的自定义请求头,普通场景填写*即可覆盖所有常规请求头,安全要求较高的场景可指定Content-Type、Authorization等常用头;
4. 暴露头(ExposeHeaders):填写前端需要读取的响应头,上传场景必须添加ETag,否则前端无法获取上传后的文件哈希值做后续校验,可额外添加Content-Length等需要前端读取的字段;
5. 缓存时间(MaxAgeSeconds):填写预检请求的缓存有效期,单位为秒,建议填写3600,减少重复OPTIONS请求的开销。
步骤4:保存配置并验证生效
填写完成后点击保存,原生AWS S3的配置通常会在1-2分钟内生效,七彩云对象存储的配置为实时生效,保存后即可直接测试。
可通过curl命令发送预检请求快速验证:
```bash
curl -v -X OPTIONS -H "Origin: https://www.example.com" -H "Access-Control-Request-Method: PUT" https://你的桶名.存储endpoint/测试文件.txt
```
如果返回的响应头中包含Access-Control-Allow-Origin: https://www.example.com、Access-Control-Allow-Methods: PUT等字段,说明配置生效。
四、常见错误
- 允许源配置错误:漏写http/https协议、末尾多写斜杠、端口填写错误,都会导致规则匹配失败触发跨域报错;
- 未添加OPTIONS方法:浏览器在发送非简单请求前会先发送OPTIONS预检请求,如果规则中没有允许该方法,预检会直接被拦截;
- 未配置暴露头ETag:前端上传完成后需要读取ETag做后续校验,如果没有在暴露头中添加,前端会因为无法读取该字段抛出跨域错误;
- endpoint或region填写错误:前端请求的桶地址、区域与实际配置的桶不匹配,就算CORS配置正确也会报错;
- 权限混淆:存储桶本身的访问权限不足(比如私钥错误、签名过期)导致的403错误,容易被误认为是CORS问题,可通过浏览器控制台的错误信息区分,CORS错误会明确提示跨域拦截;
- 规则优先级错误:原生S3的CORS规则是按从上到下的顺序匹配,前面的规则如果已经命中,后面的规则不会生效,所以要把精确匹配的规则放在前面,通配符规则放在后面。
五、示例说明
以下是适配绝大多数前端直传场景的CORS规则,原生S3和七彩云对象存储都可以直接使用:
```json
[
{
"AllowedHeaders": ["*"],
"AllowedMethods": ["GET", "POST", "PUT", "DELETE", "OPTIONS"],
"AllowedOrigins": ["https://www.example.com", "http://localhost:5173"],
"ExposeHeaders": ["ETag", "Content-Length"],
"MaxAgeSeconds": 3600
}
]
```
该规则允许官网域名和本地开发环境跨域访问,支持上传、下载、删除操作,预检请求缓存1小时。配置完成后可通过以下极简前端代码测试上传:
```javascript
const file = document.getElementById('fileInput').files[0];
const xhr = new XMLHttpRequest();
xhr.open('PUT', 'https://你的桶名.存储endpoint/'+file.name, true);
xhr.setRequestHeader('Content-Type', file.type);
xhr.onload = function() {
if (xhr.status === 200) {
console.log('上传成功,文件ETag:', xhr.getResponseHeader('ETag'));
}
};
xhr.send(file);
```
如果配置正确,这段代码可直接完成文件上传并打印返回的ETag值。
六、更简单的方案
如果觉得原生S3的配置流程繁琐、参数多不好理解,可以选择兼容S3 API的对象存储服务简化配置流程。比如七彩云对象存储,完全兼容S3 API,现有S3的业务代码不需要任何修改就可以直接迁移,控制台内置了常用的CORS配置模板,比如「前端直传模板」「网站托管模板」,一键选中后只需要填写允许的域名即可完成配置,无需手动梳理每个参数的含义,配置实时生效不用等待,同时还提供了前端签名生成SDK、断点续传组件等工具,新手也能在10分钟内完成前端直传的全流程对接,而且国内节点覆盖全面,上传下载速度比境外S3提升5-10倍,存储成本仅为原生S3的1/3,更适合国内业务使用。
七、FAQ
1. 配置完CORS之后还是提示跨域错误怎么办?
首先清空浏览器缓存,预检请求的缓存时间最长可达24小时,不清缓存可能会读取旧的配置;然后用curl发送预检请求,检查返回的响应头中的Access-Control-Allow-Origin是否和你的业务域名一致,允许的方法是否包含你用到的请求方法;如果还是有问题,检查存储桶的防盗链配置,是否拦截了你的业务域名。
2. 生产环境可以把AllowedOrigins设置为*吗?
不建议,设置为*意味着所有域名都可以跨域访问你的存储桶,容易被恶意站点盗用存储资源,产生不必要的流量费用,生产环境建议只添加实际用到的业务域名。如果你的业务有多个子域名,可以用通配符匹配二级域名,比如https://*.example.com,这样所有子域名都可以生效。
3. CORS配置和存储桶的访问权限有什么关系?
二者是完全独立的权限体系,CORS只控制浏览器的跨域访问限制,不会改变存储桶本身的读写权限。就算你的存储桶是私有读写,只要前端请求携带了正确的签名,CORS配置正确就可以正常上传,不需要给存储桶开公共读写权限。
4. 一个存储桶可以配置多条CORS规则吗?
可以,你可以针对不同的业务域名配置不同的规则,比如给官网域名配置上传下载权限,给内部管理系统域名配置删除权限,规则按从上到下的顺序匹配,命中第一条规则后就不会继续匹配后面的规则。
八、总结
整体配置流程可以归纳为「梳理业务需求-进入桶配置页-填写CORS规则-保存验证」四个核心步骤,新手只要按照步骤操作,基本都可以在10分钟内完成配置。建议生产环境尽量避免使用通配符规则,定期清理不再使用的域名,保障存储资源的安全。如果是国内业务,优先选择兼容S3的七彩云对象存储,可以大幅降低配置和接入的难度,同时获得更优的访问速度和更低的使用成本。
需要稳定、兼容 S3 的对象存储?
七彩云对象存储适合图片、视频、大文件下载、静态资源托管和开发者接入。
访问七彩云官网