S3静态托管网站不带www无法访问(Namecheap DNS、Cloudfront、ACM SSL证书)
搞定不带www前缀的S3静态网站访问问题
嘿,我来帮你捋捋这个头疼的问题!结合你提到的配置调整(换了S3 Bucket、Namecheap加了通配符CNAME、用CloudFront做分发),咱们从几个关键环节逐一排查:
1. 先盯紧CloudFront的域名和证书配置
从你给出的CloudFront截图来看,这两点一定要确认:
- 备用域名(CNAMEs):得同时把
yourdomain.com(不带www)和www.yourdomain.com都加进去!CloudFront只有识别了这两个域名,才能正确处理对应的请求,不然不带www的访问直接就会报错。 - SSL证书:证书必须覆盖这两个域名——要么申请包含主域名+通配符的证书(
yourdomain.com+*.yourdomain.com),要么单独把两个域名都加到证书里。要是证书只带www前缀,不带www的访问肯定会触发SSL安全错误。 - 另外别忘了检查默认根对象有没有设成
index.html,不然直接访问根域名可能会返回403。
2. 核对S3 Bucket的关键设置
看你的S3截图,重点检查这几个地方:
- Bucket名称最好和不带www的域名完全一致(比如
yourdomain.com),虽说通过CloudFront转发的话不是强制要求,但这样能避免一些隐性问题。 - 确保静态网站托管功能已经启用,并且索引文档、错误文档都设置正确了。
- 权限这块要注意:一定要让CloudFront的Origin Access Identity(OAI)有读取Bucket内容的权限,别图省事开公共读写,不安全还容易出问题。可以去Bucket的权限政策里添加允许OAI访问的规则。
3. 修正Namecheap的DNS配置(这里大概率有问题!)
你说加了主机记录为*的CNAME,但*只匹配所有子域名,不匹配主域名(也就是不带www的yourdomain.com)!所以你得单独加一条:
- 主机记录填
@(代表主域名),类型选CNAME,值填你的CloudFront分配域名(比如d12345abcdef.cloudfront.net)。 - 同时保留
www那条CNAME指向同一个CloudFront域名,这样不管带不带www的请求都能转到CloudFront。 - 还有,DNS修改后得等TTL生效(一般10分钟到几小时),可以用
nslookup yourdomain.com或者dig yourdomain.com命令查一下,看看解析是不是已经指向CloudFront了。
4. 检查CloudFront的行为和缓存
- 去CloudFront的**行为(Behaviors)**里看看,路径模式是不是
/*,确保所有请求都能被正确转发到S3。 - 要是之前有旧缓存,可能会影响测试,直接在CloudFront控制台的
Invalidations里添加/*刷新一遍缓存,清空旧内容。
5. 常见错误快速排查
- 访问不带www的域名出现SSL错误?那肯定是CloudFront关联的证书没覆盖主域名,去AWS证书管理器重新申请一个包含主域名的证书,再绑定到CloudFront分配上。
- 出现403 Forbidden?大概率是S3的权限没配对,检查OAI有没有权限访问Bucket,或者Bucket的政策是不是正确配置了CloudFront的访问规则。
- 出现404 Not Found?确认S3里有
index.html文件,CloudFront的默认根对象也设对了,路径没搞错。
内容的提问来源于stack exchange,提问作者jawn
相关产品推荐
相关产品推荐

