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
相关产品推荐
相关产品推荐

