AWS中实现https://www.example.com到https://example.com的重定向方案咨询
我帮你整理两种最优解决方案,完美解决你遇到的CloudFront不识别S3重定向规则的问题,彻底告别meta刷新这种临时方案:
方案一:正确配置S3静态网站 + CloudFront(适合简单重定向场景)
这应该是最直接的方案,你之前可能踩了一个常见误区——用了S3的REST API端点作为CloudFront源,导致重定向规则不生效。按以下步骤配置:
创建并配置www.example.com的S3存储桶
- 创建名为
www.example.com的S3存储桶(名称必须和域名完全一致)。 - 开启「静态网站托管」,选择「重定向到另一个域名」,目标域名填
example.com,协议选HTTPS。 - 确保存储桶的权限设置正确:不需要开启公开访问(因为CloudFront会通过Origin Access Identity访问S3),配置OAI并给它赋予读取存储桶的权限。
- 创建名为
配置CloudFront分发
- 创建新的CloudFront分发,源设置不要选自动弹出的S3存储桶,手动输入S3静态网站的端点(比如
www.example.com.s3-website-us-east-1.amazonaws.com,具体地址在S3静态网站托管页面可以找到)。 - 配置自定义域名:添加
www.example.com,并绑定在AWS Certificate Manager(ACM)中申请的SSL证书(注意:ACM证书必须在us-east-1区域申请,才能用于CloudFront)。 - 设置行为规则:将「Viewer Protocol Policy」设为
Redirect HTTP to HTTPS,确保所有HTTP请求自动转成HTTPS。 - 其他默认配置即可,等待CloudFront分发部署完成(通常需要10-15分钟)。
- 创建新的CloudFront分发,源设置不要选自动弹出的S3存储桶,手动输入S3静态网站的端点(比如
配置Route 53
将www.example.com的A/AAAA记录类型设置为「别名」,指向刚才创建的CloudFront分发域名。
这样配置后,用户访问https://www.example.com时,CloudFront会把请求转发到S3静态网站,S3会返回标准的301永久重定向到https://example.com,完全符合HTTP规范,体验比meta刷新好太多。
方案二:Lambda@Edge(适合复杂重定向逻辑)
如果你不需要依赖S3,或者有更复杂的重定向需求(比如保留路径、查询参数,或者多个子域名重定向),Lambda@Edge是更灵活的选择:
创建Lambda函数(必须在us-east-1区域)
- 进入Lambda控制台,切换到
us-east-1区域,创建一个新的Node.js函数。 - 替换函数代码为以下逻辑,实现www到主域名的301重定向,同时保留请求路径和查询参数:
exports.handler = (event, context, callback) => { const request = event.Records[0].cf.request; const host = request.headers.host[0].value; // 检查请求是否来自www子域名 if (host === 'www.example.com') { // 构造重定向URL,保留路径和查询参数 const redirectUrl = `https://example.com${request.uri}${request.querystring ? '?' + request.querystring : ''}`; const response = { status: '301', statusDescription: 'Moved Permanently', headers: { location: [{ key: 'Location', value: redirectUrl }] } }; callback(null, response); } // 非www请求直接放行 callback(null, request); }; - 发布函数的新版本(Lambda@Edge需要关联已发布的版本)。
- 进入Lambda控制台,切换到
关联Lambda@Edge到CloudFront
- 进入CloudFront控制台,找到对应的分发(如果没有就新建一个),编辑行为规则。
- 在「Lambda Function Associations」中,添加「Viewer Request」事件,选择刚才创建的Lambda函数版本。
- 配置自定义域名
www.example.com和SSL证书,Route 53记录指向CloudFront分发。
这种方式直接在CloudFront的边缘节点处理重定向,不需要经过S3,性能更高,也能轻松扩展到更复杂的重定向场景。
为什么你之前的方法不行?
你提到CloudFront无法识别S3的重定向规则,大概率是因为你把S3的REST API端点(比如s3.amazonaws.com/www.example.com)作为了CloudFront的源。这种情况下,CloudFront会把请求当作对象存储的请求,不会触发S3的静态网站重定向逻辑——只有用S3静态网站的专属端点作为源,重定向规则才会生效。
内容的提问来源于stack exchange,提问作者Glenn

