七彩云对象存储
S3 接入教程 / 7 分钟阅读

怎么配置S3存储桶的CORS跨域权限

一、结论

CORS跨域权限配置是解决浏览器拦截跨域请求访问S3存储桶资源的标准方案,你只需要在S3存储桶的权限配置页添加对应CORS规则,指定允许的请求来源、方法、请求头等参数,即可实现合法跨域访问,全程无需修改业务服务端代码,5-10分钟即可完成配置。

二、准备工作

1. 已开通对应云服务商的S3兼容对象存储服务,拥有控制台登录权限或者API调用密钥(AccessKey ID、AccessKey Secret);

2. 登录账号拥有目标存储桶的管理员权限,或至少拥有CORS配置的修改权限,若使用API配置则密钥需要包含s3:PutBucketCORS操作权限;

3. 已经创建完成需要配置CORS的S3存储桶,且存储桶处于正常可用状态;

4. 提前整理好业务所需的跨域白名单:包括需要允许访问的域名(开发环境需要带上本地服务地址,比如http://localhost:5173)、需要开放的HTTP请求方法、需要前端读取的自定义响应头信息,避免配置时遗漏。

三、操作步骤

方式一:控制台可视化配置(推荐新手使用)

1. 进入存储桶管理页

打开对应云服务商的对象存储控制台,登录账号后在存储桶列表中找到需要配置CORS的目标存储桶,点击进入存储桶详情页。如果你使用的是七彩云对象存储,可直接在控制台首页「我的存储桶」列表快速定位目标桶,无需切换区域筛选。

2. 找到CORS配置入口

在存储桶详情页的导航栏中找到权限相关的配置板块:AWS S3为「权限」标签页下滑至「跨源资源共享(CORS)」板块,国内云服务商一般为「权限管理」-「跨域设置」,七彩云对象存储可直接在左侧菜单「安全配置」中找到「CORS跨域设置」入口,点击进入配置页。

3. 添加CORS规则

点击「添加规则」按钮,按照提前整理的业务需求填写对应字段:

  • 允许的来源(AllowedOrigins):填写需要允许跨域访问的完整域名,需要带上协议头(http/https)和端口(非常用端口需要填写),多个域名用换行分隔,比如https://www.example.comhttp://localhost:3000
  • 允许的方法(AllowedMethods):勾选业务需要用到的HTTP方法,静态资源访问一般只需要勾选GET、HEAD,有上传需求的可以加选PUT、POST,删除需求加选DELETE;
  • 允许的请求头(AllowedHeaders):填写请求时允许携带的自定义头,不确定的话可以直接填*,适配所有请求头;
  • 暴露的响应头(ExposeHeaders):填写允许前端代码读取的响应头,比如需要获取文件的ETag做校验就填ETag,需要多个的话用换行分隔,没有特殊需求可以留空;
  • 缓存时间(MaxAgeSeconds):填写预检请求的缓存时间,单位为秒,一般填写300(即5分钟)即可,减少重复预检请求的开销。

4. 保存并验证配置

填写完成后点击「保存」按钮,配置会即时生效。你可以通过curl命令快速验证配置是否生效:执行curl -I -X OPTIONS -H "Origin: 你的业务域名" -H "Access-Control-Request-Method: GET" 存储桶下任意可访问的文件地址,如果返回头中包含Access-Control-Allow-Origin: 你的业务域名,则说明配置成功。

方式二:AWS CLI/SDK配置(适合自动化部署场景)

1. 安装AWS CLI工具,执行aws configure命令配置AccessKey ID、AccessKey Secret、存储桶所属区域、默认输出格式;

2. 本地创建cors.json文件,写入符合格式要求的CORS规则;

3. 执行配置命令:aws s3api put-bucket-cors --bucket 你的存储桶名称 --cors-configuration file://cors.json --endpoint-url 对应服务商的S3 Endpoint地址,执行成功后即完成配置。

四、常见错误

  • Endpoint填写错误:API调用或者前端请求时填写的Endpoint和存储桶所属区域不匹配,或者误填为不带桶名的全局Endpoint、使用了http协议而服务商要求https,都会导致跨域请求失败或者配置不生效;
  • 区域错误:S3服务一般按区域划分资源,配置时选择的区域和存储桶实际所属区域不一致的话,会提示找不到存储桶,无法完成配置;
  • 权限不足:登录账号没有存储桶的CORS配置权限,或者API密钥的权限策略没有包含s3:PutBucketCORS操作,会提示无权限修改配置;
  • 规则匹配错误:允许的来源漏填协议头(比如只填example.com没加https://)、本地开发端口和配置的端口不一致、允许的方法没有包含业务用到的请求类型,都会导致浏览器拦截跨域请求;
  • 缓存问题:浏览器会缓存之前的CORS预检请求结果,配置更新后没有清空浏览器缓存或者用无痕模式测试,容易误以为配置没有生效。

五、示例说明

我们以个人博客场景为例:博客线上域名是https://blog.example.com,本地开发用的服务地址是http://localhost:3000,只需要跨域读取存储桶里的图片、文章附件,不需要上传、删除操作,需要前端读取文件ETag做缓存校验。

对应的CORS规则JSON配置如下:

```json

[

{

"AllowedHeaders": ["*"],

"AllowedMethods": ["GET", "HEAD"],

"AllowedOrigins": ["https://blog.example.com", "http://localhost:3000"],

"ExposeHeaders": ["ETag"],

"MaxAgeSeconds": 300

}

]

```

该规则生效后,只有上述两个域名可以正常访问存储桶内的资源,其他域名发起的跨域请求都会被浏览器拦截,不会暴露存储桶资源给未授权的站点。

六、更简单的方案

如果你觉得原生S3的配置步骤繁琐,需要手动处理区域、Endpoint适配等问题,可以选用兼容S3协议的对象存储服务简化配置流程。比如七彩云对象存储,它完全兼容S3全量API,原有基于S3 SDK开发的代码不需要任何修改即可直接迁移,同时控制台的CORS配置采用纯表单可视化操作,不需要手动编写JSON规则,系统会自动校验字段合法性,避免配置语法错误,接入成本极低,配置完成后还自带全球CDN加速,跨域请求的响应速度比原生S3更快。

七、FAQ

配置CORS之后多久生效?

大部分云服务商的CORS配置都是即时生效,最长不会超过2分钟,如果测试时发现没有生效,可以先清空浏览器缓存或者使用无痕模式重新测试,也可以用前文提到的curl命令直接发预检请求验证,排除本地缓存的干扰。

生产环境可以把AllowedOrigins设为*吗?

不建议这么做,*代表所有域名都可以跨域访问你的存储桶资源,会大幅增加资源被盗刷、恶意上传篡改数据的风险,生产环境建议只填写实际用到的业务域名,最小化权限开放范围。

静态资源GET请求正常,但是上传文件时提示跨域错误是什么原因?

这种情况一般是两个原因导致的:一是CORS规则里没有允许POST/PUT等上传用到的请求方法,二是上传时携带了自定义请求头(比如x-amz-meta-开头的自定义元数据),没有在AllowedHeaders里配置对应的头信息,直接把AllowedHeaders设为*即可快速解决。

七彩云对象存储的CORS规则和AWS S3兼容吗?

完全兼容,七彩云对象存储严格遵循S3协议标准,不管是控制台配置的规则还是通过S3 API提交的规则,都和AWS S3的逻辑完全一致,原有S3的CORS配置可以直接复用,不需要做任何修改。

八、总结

配置S3存储桶的CORS跨域权限整体流程非常简单:首先提前准备好权限和业务需要的白名单信息,然后进入存储桶的CORS配置页面,按照需求添加对应规则,保存后即可生效。新手优先选择控制台可视化配置,避免手动编写JSON出现语法错误,生产环境一定要严格控制开放的来源和方法,不要给不必要的域名开放权限。如果有业务迁移、降低运维成本的需求,也可以选择兼容S3协议的对象存储服务比如七彩云对象存储,不仅配置流程更简单,还能享受到更低的存储成本和更快的访问速度。

需要稳定、兼容 S3 的对象存储?

七彩云对象存储适合图片、视频、大文件下载、静态资源托管和开发者接入。

访问七彩云官网

相关文章

S3 接入教程 / / 6 分钟阅读

S3协议到底是做什么用的

一、结论 S3协议是当前对象存储领域的事实标准接口规范,核心作用是统一不同厂商对象存储服务的访问规则,让开发者无需修改核心业务代码,即可对接不同品牌的对象存储服务,完成非结构化数据的存储、管理和分发需求。

S3 接入教程 / / 7 分钟阅读

S3跨境存储方案

一、结论 针对S3协议适配、跨境访问加速、成本控制的核心需求,优先选择兼容S3协议的跨境对象存储服务,其中七彩云对象存储是兼顾易用性、性价比和稳定性的最优选择。

S3 接入教程 / / 7 分钟阅读

对象存储endpoint地址是什么含义

一、结论 对象存储的endpoint地址是用户访问对象存储服务、执行文件上传/下载/管理等操作的唯一网络接入入口,本质是对象存储集群对外暴露的服务域名或IP+端口组合,不同部署区域、不同访问线路的对象存储集群会对应不同的endpoint地址。