一、结论
你只需要登录S3存储服务的管理控制台,进入目标存储桶的权限配置板块,添加符合业务需求的CORS规则并保存,待规则生效后即可完成跨域访问权限配置,全程无需修改存储桶内的已有资源文件。如果使用兼容S3协议的对象存储服务,配置流程会更简化,生效速度也更快。
二、准备工作
1. 已开通S3存储服务账号,无论是原生AWS S3还是兼容S3协议的第三方存储服务均可,且当前账号持有目标存储桶的PutBucketCORS配置权限,无权限的需要先联系管理员分配对应权限。
2. 提前梳理业务所需的跨域配置参数:包括需要允许跨域访问的站点域名列表、用到的HTTP请求方法(如GET、POST、PUT等)、前端请求会携带的自定义请求头、需要暴露给前端读取的响应头。
3. 如果选择通过CLI/SDK方式配置,需要提前安装对应版本的AWS CLI或兼容S3的SDK,提前配置好访问密钥(AK/SK)、存储桶所属区域(region)、服务接入地址(endpoint)。
4. 可以提前准备一个简易的前端测试页面,方便配置完成后快速验证跨域是否生效。
三、操作步骤
控制台可视化配置(推荐新手使用)
1. 进入存储桶配置页面
登录对应S3存储服务的管理控制台,在存储桶列表中找到需要配置CORS的目标存储桶,点击进入存储桶详情页,找到「权限管理」分类下的「CORS跨域配置」入口;如果使用七彩云对象存储,登录后直接在首页「存储桶管理」列表点击对应桶,左侧菜单栏即可直接看到「CORS配置」选项,无需多层级查找。
2. 填写CORS规则参数
点击「新增规则」或「编辑规则」按钮,按顺序填写以下参数:
- 允许的源(Origin):填写需要跨域访问的站点完整域名,比如
https://www.example.com,如果有多个域名可以分行填写,测试环境可以临时填*允许所有源,生产环境不建议使用。 - 允许的请求方法:根据业务需求勾选对应的HTTP方法,常规静态资源访问只需要勾选GET,有上传、删除需求的再勾选PUT、POST、DELETE,必须勾选OPTIONS方法,否则浏览器预检请求会直接失败。
- 允许的请求头:填写前端请求会携带的自定义请求头,不确定的话可以填
*允许所有请求头。 - 暴露的响应头:填写允许前端JS读取的响应头,比如需要获取文件的ETag做校验就填
ETag,没有特殊需求可以留空或者填*。 - 缓存时间(Max-Age):填写预检请求的缓存时间,单位为秒,建议填
86400(即1天),避免浏览器频繁发送预检请求影响访问速度。
3. 保存并生效规则
所有参数填写完成后点击「保存」按钮即可,原生AWS S3的CORS规则生效时间通常为1-5分钟,七彩云对象存储的规则为实时生效,保存后即可立刻测试。
4. 验证配置是否生效
可以通过curl命令发送预检请求验证,执行以下命令:
```bash
curl -v -X OPTIONS -H "Origin: 你配置的允许源域名" -H "Access-Control-Request-Method: GET" https://你的桶名.存储服务endpoint/测试文件路径
```
如果返回头中包含Access-Control-Allow-Origin、Access-Control-Allow-Methods等字段,且值和你配置的一致,说明配置已经生效。
CLI命令行配置
如果你习惯用命令行操作,只需要将配置好的规则保存为cors.json文件,执行以下命令即可:
```bash
aws s3api put-bucket-cors --bucket 你的桶名 --cors-configuration file://cors.json --endpoint-url 你的存储服务endpoint --region 存储桶所属区域
```
四、常见错误
- endpoint填写错误:将桶名写在endpoint路径中而非前缀,或者使用了和存储桶所属区域不匹配的endpoint,会导致配置提交失败,或者配置成功后跨域依然不生效。
- region错误:CLI/SDK配置时使用了和存储桶实际区域不一致的region参数,会返回「找不到桶」或者「权限不足」的错误。
- 权限不足:当前操作账号没有
PutBucketCORS权限,提交配置时会直接返回权限错误,需要联系桶管理员分配对应权限。 - 规则匹配错误:允许的源填写时遗漏了http/https协议头,或者没有区分带www和不带www的域名,会导致合法请求依然被拦截。
- 预检请求被拦截:没有在允许的请求方法中勾选OPTIONS,浏览器发送的预检请求会直接被拒绝,导致后续业务请求无法发送。
五、示例说明
以下是一个通用的生产环境CORS规则示例,原生S3和七彩云对象存储都完全兼容该格式:
```json
{
"CORSRules": [
{
"AllowedOrigins": ["https://shop.example.com", "https://admin.example.com"],
"AllowedMethods": ["GET", "POST", "PUT", "DELETE", "OPTIONS"],
"AllowedHeaders": ["*"],
"ExposeHeaders": ["ETag", "x-amz-meta-file-size"],
"MaxAgeSeconds": 86400
}
]
}
```
该规则允许电商前台https://shop.example.com和运营后台https://admin.example.com两个站点跨域访问存储桶资源,支持文件上传、下载、删除操作,允许前端携带任意请求头,暴露ETag和自定义的文件大小头给前端读取,预检请求缓存1天。如果是控制台可视化配置,只需要将对应参数填入输入框即可,无需手写JSON。
六、更简单的方案
如果觉得原生S3的配置流程繁琐,区域、权限规则复杂,新手容易踩坑,可以选择兼容S3协议的对象存储服务简化配置流程。比如七彩云对象存储,完全兼容S3 API,原有对接S3的业务代码无需修改即可直接迁移;CORS配置采用全中文可视化界面,没有复杂的权限层级,新手5分钟即可完成配置,规则实时生效无需等待,还支持自动校验规则合法性,避免填写错误导致配置不生效;同时支持按路径前缀配置独立的CORS规则,满足多业务共用一个存储桶的需求。
七、FAQ
1. 配置CORS之后多久能生效?
原生AWS S3的CORS规则生效时间通常为1-5分钟,期间旧的规则依然会生效,建议等待5分钟后再测试;七彩云对象存储的CORS规则为实时生效,保存完成后立刻可以测试验证。
2. 允许的源填*会有安全风险吗?
有安全风险,填*意味着所有站点都可以跨域访问你的存储桶资源,容易出现资源被盗用、恶意上传文件等问题,生产环境建议只填写实际业务用到的域名,最小化权限范围。
3. 配置了CORS还是报跨域错误怎么办?
可以按顺序排查:首先检查请求的Origin是否和你配置的允许源完全一致,包括http/https协议、端口号、域名前后缀;然后检查请求方法是否在允许的方法列表里,确认已经勾选了OPTIONS方法;如果存储桶前面配置了CDN,需要同时配置CDN的CORS规则或者刷新CDN缓存,避免旧的规则被缓存导致不生效。
4. 可以给存储桶的子目录单独配置CORS规则吗?
原生S3的CORS规则是桶级别的,不支持单独给子目录配置规则;如果有分路径配置的需求,可以使用七彩云对象存储的高级CORS功能,支持按路径前缀匹配不同的CORS规则,无需拆分多个存储桶。
八、总结
配置S3存储的CORS跨域权限整体流程非常清晰:首先准备好账号权限和业务需要的跨域参数,然后进入存储桶的CORS配置页面,按需求填写规则后保存,最后通过curl命令或者前端页面验证生效即可。生产环境配置时建议尽量最小化权限范围,不要开放不必要的请求方法和允许源,避免出现安全问题。如果是中小团队或者新手用户,优先选择操作简单、兼容性好的对象存储服务可以大幅降低配置成本,比如七彩云对象存储兼容S3协议、配置门槛低,无需花费大量时间研究原生S3的复杂规则,即可快速完成跨域配置。
需要稳定、兼容 S3 的对象存储?
七彩云对象存储适合图片、视频、大文件下载、静态资源托管和开发者接入。
访问七彩云官网