如何将s3.amazonaws.com格式的S3请求重定向至新存储桶?
解决方案:重定向S3路径式端点请求到自有域名
针对你提到的https://s3.amazonaws.com/<bucketName>/<fileName>这类路径式S3链接的重定向需求,有两种可靠方案,具体如下:
方案一:S3桶级静态网站重定向(简单场景首选)
这种方式直接利用S3的静态网站托管功能配置重定向,无需额外服务:
- 登录AWS控制台,进入旧存储桶的属性页,找到静态网站托管选项,点击“编辑”。
- 选择“重定向所有请求到另一个主机名”,在“目标主机名”中填入你的自有端点域名(例如
https://your-custom-domain.com)。
- 选择“重定向所有请求到另一个主机名”,在“目标主机名”中填入你的自有端点域名(例如
- 勾选“保留原请求路径”,这样旧链接中的
<fileName>会被自动附加到自有端点的URL后(比如https://s3.amazonaws.com/mybucket/image.png会重定向到https://your-custom-domain.com/image.png)。
- 勾选“保留原请求路径”,这样旧链接中的
- 设置重定向协议为HTTPS,确保跳转后的链接安全。
- 保存配置后,调整旧桶的桶策略,允许公开访问重定向响应(无需保留原对象,因为重定向由S3直接返回)。示例桶策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::your-old-bucket/*" } ] }
配置完成后,旧链接的请求会被S3自动重定向到你的自有端点。
方案二:CloudFront + Lambda@Edge(复杂场景适配)
如果需要根据文件迁移状态动态调整重定向逻辑(比如部分文件未迁移时临时返回旧桶内容),可以用CloudFront结合Lambda@Edge实现:
- 创建一个CloudFront分发,将源设置为旧S3桶的路径式端点(
s3.amazonaws.com/your-old-bucket),并配置HTTPS协议。
- 创建一个CloudFront分发,将源设置为旧S3桶的路径式端点(
- 在CloudFront的行为设置中,添加“查看器请求”事件的Lambda@Edge触发。
- 编写Lambda函数,解析请求的URI路径,生成指向自有端点的重定向URL。示例函数代码(Node.js):
exports.handler = (event, context, callback) => { const request = event.Records[0].cf.request; const fileName = request.uri; const redirectUrl = `https://your-custom-domain.com${fileName}`; const response = { status: '302', statusDescription: 'Found', headers: { 'location': [{ key: 'Location', value: redirectUrl }] } }; callback(null, response); };
- 将Lambda函数部署到
us-east-1区域,并关联到CloudFront分发。
- 将Lambda函数部署到
- 调整旧桶的桶策略,只允许CloudFront的OAI(Origin Access Identity)访问,禁止直接公开访问,确保所有请求都经过CloudFront处理。
这种方案的优势是可以灵活扩展逻辑,比如根据文件名判断是否已迁移,未迁移的请求仍返回旧桶内容,完成迁移后再统一重定向。
内容的提问来源于stack exchange,提问作者Mohammed Suhail
相关产品推荐
相关产品推荐

