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

CloudFront与S3多域名托管下文件夹访问重定向异常问题

解决单S3桶多域名托管下根路径重定向空文件问题

可能的原因及修复方案

1. 修正Lambda@Edge的路径处理逻辑

当访问folder1/这类以斜杠结尾的路径时,错误的路径拼接会导致S3找不到对应对象,返回空文件。确保路径修改时不会产生双斜杠,且目标对象键与S3中实际存储的一致:

// 在Viewer Request阶段修改请求路径
exports.handler = (event, context, callback) => {
  const request = event.Records[0].cf.request;
  const uri = request.uri;

  // 处理以/结尾的路径,追加index文件
  if (uri.endsWith('/')) {
    // 移除末尾斜杠后拼接/index,避免双斜杠
    request.uri = `${uri.slice(0, -1)}/index`.replace(/\/+/g, '/');
  }

  callback(null, request);
};

注意:S3中没有真实的文件夹结构,你的index文件实际对象键应为folder1/index,而非folder1//index或其他错误格式。

2. 检查S3对象的Content-Type元数据

如果index文件的Content-Type被设置为binary/octet-stream(默认上传可能出现),CloudFront会将其识别为可下载文件而非网页,导致浏览器下载空文件。

  • 修复方式:在S3控制台找到对应index对象,修改其元数据,将Content-Type设为text/html;或上传文件时通过CLI指定该类型:
    aws s3 cp folder1/index s3://your-bucket/folder1/index --content-type text/html
    

3. 确认Lambda@Edge触发时机与缓存策略

  • 确保Lambda@Edge配置在Viewer Request阶段触发,这样能在请求进入CloudFront缓存前修改路径,避免旧缓存影响。
  • 多域名托管场景下,CloudFront的缓存键需要包含Host头,否则不同域名的缓存会互相干扰。可在缓存策略中添加Host作为缓存键的一部分。

4. 排查S3静态网站托管冲突

如果同时启用了S3静态网站托管功能,其默认索引文档规则(比如指向index.html)可能与你的Lambda逻辑冲突。要么将文件重命名为index.html并调整Lambda路径,要么关闭S3静态网站托管,完全依赖Lambda@Edge处理路径路由。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 12:55:18