You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

S3 Bucket重定向对象未跳转反而下载空文件问题求助

问题分析与解决方案

你的PutObjectCommand代码本身没有问题,WebsiteRedirectLocation元数据已经正确附加到对象上。问题的核心在于:

  • S3的WebsiteRedirectLocation元数据仅在通过S3静态网站托管的专属端点访问时才会触发重定向,直接访问S3 REST端点(包括预签名URL)不会识别该元数据;
  • CloudFront默认拉取S3 REST端点的内容,同样不会自动处理这个重定向元数据。

一、解决预签名URL无法触发重定向的问题

预签名URL本质是S3 REST端点的授权访问链接,S3不会在REST请求中处理WebsiteRedirectLocation。如果必须用预签名URL实现重定向,有两种替代方案:

  1. 改用S3静态网站托管端点+桶政策授权:
    • 确保存储桶静态网站托管已启用(你已经配置了);
    • 修改桶政策,允许目标用户访问静态网站端点的对应对象;
    • 注意:静态网站托管端点不支持预签名URL,所以需要通过桶政策或IAM权限控制访问,而非预签名。
  2. 应用层处理重定向:
    • 在你的应用中,先通过HeadObjectCommand获取对象的WebsiteRedirectLocation元数据;
    • 直接在应用层返回302重定向到目标URL,而非返回S3预签名URL。

二、解决CloudFront无法触发重定向的问题

要让CloudFront识别并处理S3对象的WebsiteRedirectLocation元数据,有两种可行方案:

方案1:配置CloudFront使用S3静态网站托管作为源

  • 将CloudFront的源从S3 REST端点(bucket.s3.region.amazonaws.com)改为S3静态网站托管端点(bucket.s3-website.region.amazonaws.com);
  • 在CloudFront行为中设置允许HTTP重定向,并调整缓存策略避免错误缓存重定向响应;
  • 注意:静态网站托管端点默认仅支持HTTP,若需要HTTPS,需通过CloudFront提供证书。

方案2:使用Lambda@Edge处理重定向

创建一个Origin Response类型的Lambda函数,读取S3对象的重定向元数据并返回302响应:

exports.handler = async (event) => {
    const response = event.Records[0].cf.response;
    const redirectLocation = response.headers['x-amz-meta-website-redirect-location'];
    
    if (redirectLocation) {
        return {
            status: '302',
            statusDescription: 'Found',
            headers: {
                location: [{ key: 'Location', value: redirectLocation[0].value }]
            }
        };
    }
    
    return response;
};

将该函数关联到CloudFront的对应行为上,确保函数部署在CloudFront支持的区域(如us-east-1)。

三、Terraform配置补充

你的存储桶静态网站托管配置已正确,若采用方案1,需在CloudFront配置中指定静态网站域名:

resource "aws_cloudfront_distribution" "url_redirect" {
    # 其他基础配置...
    origin {
        domain_name = module.urls_s3_bucket.website_domain
        origin_id   = "S3-Website-Origin"
        
        custom_origin_config {
            http_port  = 80
            https_port = 443
            origin_protocol_policy = "http-only"
        }
    }

    # 行为配置示例
    default_cache_behavior {
        allowed_methods  = ["GET", "HEAD"]
        cached_methods   = ["GET", "HEAD"]
        target_origin_id = "S3-Website-Origin"
        
        # 允许重定向缓存
        forwarded_values {
            query_string = false
            cookies {
                forward = "none"
            }
        }
        
        viewer_protocol_policy = "redirect-to-https"
        min_ttl                = 0
        default_ttl            = 300
        max_ttl                = 3600
    }
}

内容的提问来源于stack exchange,提问作者Tal Rofe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 06:02:56