如何配置S3子文件夹实现无index.html路径访问(自定义域名)
这是个很常见的S3静态网站托管场景需求,我来给你捋捋两种最优实现方式,你可以根据自己的场景选择:
方案1:仅用S3静态网站托管(无CloudFront)
这种方式成本最低,不需要额外服务,适合小型静态站点:
确认基础配置:确保你的S3存储桶已经开启了静态网站托管,全局索引文档设置为
index.html(这应该已经完成了,因为根目录的index.html能正常访问)。配置S3重定向规则
S3默认只会在用户访问带末尾斜杠的路径(比如/old/)时,自动加载该目录下的index.html;但如果用户输入/old(不带斜杠),S3会把它当成一个文件去查找,找不到就返回403。所以我们需要配置重定向规则,把不带斜杠的请求转成带斜杠的:登录AWS控制台,进入你的S3存储桶 → 「属性」标签 → 拉到「静态网站托管」部分 → 编辑「重定向规则」,粘贴以下JSON配置:
[ { "Condition": { "KeyPrefixEquals": "old", "HttpErrorCodeReturnedEquals": "404" }, "Redirect": { "HostName": "example.com", "HttpRedirectCode": "301", "Protocol": "https", "ReplaceKeyPrefixWith": "old/" } }, { "Condition": { "KeyPrefixEquals": "new", "HttpErrorCodeReturnedEquals": "404" }, "Redirect": { "HostName": "example.com", "HttpRedirectCode": "301", "Protocol": "https", "ReplaceKeyPrefixWith": "new/" } } ]这个规则的逻辑是:当用户访问
https://example.com/old时,S3找不到名为old的文件(返回404),就触发301永久重定向到https://example.com/old/,此时S3就会自动加载old/index.html了。301重定向对SEO也更友好。验证权限:确保
old/index.html和new/index.html文件的权限是公开可读的,或者通过桶策略允许公众访问这些路径。
方案2:结合CloudFront(推荐生产环境使用)
如果你的站点是生产环境,或者需要缓存、更灵活的HTTPS配置、自定义域名管理,推荐用CloudFront配合S3:
基础配置:已经把CloudFront分配指向你的S3静态网站托管端点(或者直接指向S3桶,注意配置Origin Access Control避免公开桶)。
配置CloudFront行为重定向
- 进入CloudFront控制台,打开你的分配 → 「行为」标签 → 创建新行为:
- 路径模式填
/old,把「重定向到另一个路径」勾选上,目标路径填/old/,重定向类型选301永久重定向。 - 重复上述步骤,创建路径模式为
/new的行为,重定向到/new/。
- 路径模式填
- 这样用户访问
/old时,CloudFront直接重定向到/old/,S3自动加载对应目录的index.html。
- 进入CloudFront控制台,打开你的分配 → 「行为」标签 → 创建新行为:
进阶优化(可选):如果需要更灵活的路径处理(比如支持更深层次的子路径),可以用Lambda@Edge编写一个简单的重定向函数,统一处理所有不带斜杠的目录请求。
关键注意点
- 确保S3桶里确实存在
old/和new/对应的文件结构(S3的目录是虚拟的,只要old/index.html和new/index.html文件路径正确即可)。 - 如果用自定义域名,确认DNS解析已经正确指向S3端点或者CloudFront分配。
内容的提问来源于stack exchange,提问作者g3blv

