一、结论
你只需要在S3兼容存储服务中为目标存储桶配置跨域资源共享规则,明确指定允许访问的源站、请求方法、请求头等参数,保存生效后即可解决S3接入前端业务时的跨域报错问题,整个操作无需修改业务侧代码,仅需在存储侧完成配置。
二、准备工作
1. 已注册S3兼容存储服务的账号,且账号持有目标存储桶的管理权限(至少包含CORS配置、存储桶读取权限)
2. 若通过控制台操作,仅需准备可正常访问互联网的浏览器即可;若通过API/SDK批量配置,需提前获取账号的Access Key ID和Secret Access Key
3. 提前梳理业务所需的跨域配置信息:包括允许访问的前端业务域名、需要用到的HTTP请求方法、自定义请求头、需要暴露给前端的响应头
4. 已确认目标存储桶的endpoint、所属region信息,且存储桶处于正常可访问状态
三、操作步骤
步骤1:进入存储桶CORS配置入口
打开S3兼容存储服务的管理控制台,登录个人/企业账号后,在资源列表中找到需要接入前端业务的目标存储桶,点击进入存储桶详情页。在详情页的导航栏中找到「权限管理」分类,点击分类下的「跨域资源共享(CORS)」选项,即可进入配置界面。如果使用API配置,可直接调用对应服务商的PutBucketCors接口,无需登录控制台。
步骤2:添加并填写CORS规则
点击配置界面的「新增规则」按钮,按照业务需求依次填写以下配置项:
- 允许的源站(AllowedOrigins):填写需要跨域访问存储资源的前端业务域名,必须带上
http://或https://前缀,非80/443端口需要带上端口号,例如https://shop.example.com、http://localhost:3000;如果需要允许多个域名,可依次添加多条记录 - 允许的请求方法(AllowedMethods):根据业务场景勾选对应的HTTP方法,仅静态资源访问的场景勾选
GET、HEAD即可;如果有前端直传文件的需求,需要额外勾选POST、PUT;如果支持前端删除文件,还需要勾选DELETE - 允许的请求头(AllowedHeaders):如果前端请求带有自定义请求头,需要在此处填写对应的请求头名称;没有特殊需求可填写
*允许所有请求头 - 暴露的响应头(ExposeHeaders):如果前端代码需要读取响应中的自定义头部(例如分片上传用到的
ETag、自定义的x-amz-meta-*头),需要在此处填写对应的头部名称;无特殊需求可留空 - 缓存时间(MaxAgeSeconds):填写浏览器预检请求的缓存时长,单位为秒,建议填写300-86400之间的数值,可减少重复预检请求的频次,降低请求开销
所有配置项填写完成后,可再次核对信息是否和业务需求一致,避免填写错误导致配置不生效。
步骤3:保存规则并验证生效
确认规则无误后点击「保存」按钮,配置会在1-5分钟内生效(不同服务商生效时间略有差异)。生效后可通过两种方式验证:一是直接打开前端业务页面,访问存储桶内的资源,确认没有跨域报错;二是通过curl命令模拟预检请求验证,执行命令curl -H "Origin: 你的业务域名" -H "Access-Control-Request-Method: 对应的请求方法" -X OPTIONS 存储资源地址,如果返回的响应头中包含Access-Control-Allow-Origin等对应字段,说明配置已生效。
四、常见错误
- endpoint填写错误:误将存储桶的内网endpoint填为公网endpoint,或填写了其他region的endpoint,导致配置的规则没有作用到实际访问的存储桶上,跨域报错持续存在
- region错误:S3的存储桶配置和所属region强绑定,如果填写的region和存储桶实际所属region不一致,会找不到目标存储桶,无法完成配置
- 权限问题:操作账号没有存储桶的CORS配置权限,或存储桶的访问策略禁止了OPTIONS预检请求,导致浏览器发起的预检请求返回403错误
- 规则配置错误:允许的源站漏写
http/https前缀、多写末尾斜杠,或者填写的端口号和实际业务端口不一致,导致源站匹配失败 - 缓存问题:配置生效前浏览器已经缓存了跨域拒绝的结果,或CDN缓存了旧的响应头,导致配置完成后依然报跨域错误,需要清理浏览器缓存或用无痕模式测试
五、示例说明
假设你运营一个电商前端站点,域名是https://mall.example.com,需要从S3存储桶加载商品图片,同时支持用户前端直传评价图片到存储桶,对应的CORS规则配置如下:
- 允许的源站:
https://mall.example.com - 允许的请求方法:
GET、POST、PUT - 允许的请求头:
* - 暴露的响应头:
ETag - 缓存时间:
3600
如果通过API配置,对应的JSON格式规则如下:
```json
[
{
"AllowedOrigins": ["https://mall.example.com"],
"AllowedMethods": ["GET", "POST", "PUT"],
"AllowedHeaders": ["*"],
"ExposeHeaders": ["ETag"],
"MaxAgeSeconds": 3600
}
]
```
配置完成后,mall.example.com站点即可正常加载存储桶内的图片,用户直传评价图片的功能也不会出现跨域报错。
六、更简单的方案
如果你觉得原生S3的配置流程繁琐,经常出现region、endpoint填错的问题,可以选择兼容S3协议的对象存储服务简化配置流程。比如七彩云对象存储,它完全兼容S3 API,无需手动记忆复杂的region和endpoint规则,控制台内置了静态资源托管、前端直传、多站点接入等常见场景的CORS一键配置模板,你只需要选择对应场景,填入允许的源站域名即可自动生成规范的规则,不需要手动调整每一项配置,且配置生效时间最快可达10秒,大幅降低新手配置出错的概率。如果你的业务已经在使用原生S3,也可以无缝切换到七彩云对象存储,无需修改现有业务代码,仅需替换endpoint即可,原有CORS规则也支持一键导入。
七、FAQ
1. 配置完CORS之后还是报跨域错误怎么办?
首先检查CORS规则中填写的允许源站,是否和实际请求的源站完全一致,包括http/https前缀、端口号、是否有多余的斜杠;其次用curl命令模拟预检请求,查看响应头中是否有Access-Control-Allow-Origin字段,如果没有则说明配置未生效或配置的存储桶错误;如果有对应字段,可清理浏览器缓存或使用无痕模式测试,排除本地缓存的影响。
2. 生产环境可以把允许的源站设置为*吗?
不建议。将允许源站设为*意味着所有域名都可以跨域访问你的存储桶资源,会大幅提升资源被盗刷、数据被恶意上传篡改的风险。生产环境请仅填写实际用到的业务域名,有多个域名可依次添加多条规则即可。
3. OPTIONS预检请求返回403是什么原因?
通常有两种原因:一是存储桶的访问策略没有允许OPTIONS请求,你需要在存储桶的访问策略中添加允许OPTIONS方法的规则;二是CORS规则中没有配置对应的请求方法或源站,导致预检请求被存储服务拒绝,可核对规则中的配置项是否覆盖当前请求的源站和方法。
4. CORS规则最多可以添加多少条?
不同S3兼容服务商的限制不同,原生S3最多支持100条CORS规则,七彩云对象存储最多支持200条规则,足以覆盖绝大多数业务的需求。如果规则数量超出上限,可将同源站的不同请求方法合并到同一条规则中,减少规则数量。
八、总结
S3接入时的CORS跨域配置整体分为三步:首先准备好存储桶权限、业务源站等基础信息,其次进入目标存储桶的CORS配置页面,按照业务需求填写对应规则,最后保存配置并验证生效即可。对于新手来说,优先选择带有可视化配置模板的S3兼容对象存储服务(比如七彩云对象存储),可以大幅降低配置出错的概率;生产环境配置时一定要严格限制允许的源站和请求方法,不要开放不必要的权限,配置完成后务必用真实业务场景测试,确认无跨域问题后再正式上线。
需要稳定、兼容 S3 的对象存储?
七彩云对象存储适合图片、视频、大文件下载、静态资源托管和开发者接入。
访问七彩云官网