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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 17:02:42