AWS CloudFront函数访问索引文档异常问题排查
解决方案
1. 检查CloudFront函数的关联配置
- 确认处理
www.xyz.com的分发已关联目标CloudFront函数,且触发事件设置为viewer request(需在请求到达源站前修改路径)。常见疏漏是仅将函数挂到xyz.com的分发,未同步到www的分发。 - 验证函数部署状态:确保函数已发布至
LIVE版本,而非停留在DEVELOPMENT阶段。
2. 修复文件扩展名判断逻辑(解决官方示例缺陷)
官方示例用includes('.')会误判域名中的点,需仅检查路径的最后一段(basename)。修正后的判断逻辑如下:
function hasFileExtension(path) { const segments = path.split('/'); const basename = segments[segments.length - 1]; // 排除隐藏文件(如/.env)和纯点路径,仅识别带正常扩展名的文件 return basename.includes('.') && !basename.startsWith('.') && basename !== '.'; }
3. 统一处理文件夹路径请求
无需在函数中处理域名(xyz.com已重定向至www.xyz.com,最终仅需处理www分发的请求),只需专注修改请求路径。完整函数代码示例:
function handler(event) { const request = event.request; let uri = request.uri; // 根目录直接返回索引文档 if (uri === '/') { request.uri = '/index.html'; return request; } // 统一标准化路径:移除末尾的斜杠 const normalizedUri = uri.endsWith('/') ? uri.slice(0, -1) : uri; // 若路径无文件扩展名,判定为文件夹,拼接索引文档路径 if (!hasFileExtension(normalizedUri)) { request.uri = normalizedUri + '/index.html'; } return request; } // 辅助函数:判断路径是否含文件扩展名 function hasFileExtension(path) { const segments = path.split('/'); const basename = segments[segments.length - 1]; return basename.includes('.') && !basename.startsWith('.') && basename !== '.'; }
4. 验证函数行为
- 用CloudFront函数的测试功能,分别模拟
/folder和/folder/路径的请求(来自www.xyz.com),确认函数能将uri正确修改为/folder/index.html。 - 测试带扩展名的路径(如
/assets/style.css),确保函数不会修改这类请求的路径。
5. 确认S3存储桶配置
- 检查S3静态网站托管的索引文档设置是否为
index.html(需与函数中拼接的文件名一致)。 - 确保存储桶内目标文件夹下存在对应
index.html文件(如s3://your-bucket/folder/index.html)。
内容的提问来源于stack exchange,提问作者Marc Rochkind
相关产品推荐
相关产品推荐

