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

如何用Amazon S3/CloudFront托管数千个带自定义域名的网站?

解决方案:多租户自定义域名静态网站托管(基于S3+CloudFront)

核心架构思路

用CloudFront作为统一入口,结合路径重写能力实现自定义域名到S3子文件夹的映射,配合AWS Certificate Manager(ACM)自动管理SSL证书,完美解决自定义域名HTTPS访问需求,同时规避原有两个方案的缺陷。

详细配置步骤

1. S3桶基础配置

  • 保留桶名all-sites,不要开启静态网站托管,采用S3 REST API作为CloudFront的数据源。
  • 配置桶访问策略,仅允许CloudFront的Origin Access Identity(OAI)读取资源,禁止公开访问,确保数据安全:
    {
        "Version": "2008-10-17",
        "Id": "CloudFrontPrivateAccessPolicy",
        "Statement": [
            {
                "Sid": "AllowCloudFrontAccess",
                "Effect": "Allow",
                "Principal": {
                    "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity XXXXXXXX"
                },
                "Action": "s3:GetObject",
                "Resource": "arn:aws:s3:::all-sites/*"
            }
        ]
    }
    
  • 保持现有子文件夹结构,每个用户网站资源存放在独立目录(如client1-site、client2-site)。

2. CloudFront分发配置

  • 创建CloudFront分发,源地址选择all-sites桶的REST API端点(格式类似all-sites.s3.amazonaws.com),并关联上述OAI。
  • 自定义域名与SSL证书:
    • 在分发的「Alternate Domain Names (CNAMEs)」中添加用户的自定义域名(如client1.com)。
    • 在AWS us-east-1区域(CloudFront仅识别该区域证书)通过ACM申请对应域名的SSL证书,证书支持自动续期,无需手动维护。
  • 路径重写(关键):
    • 使用CloudFront Functions(轻量低成本)或Lambda@Edge(复杂场景)实现域名到子文件夹的映射。示例CloudFront Functions代码:
      function handler(event) {
          const request = event.request;
          const host = request.headers.host.value;
          
          // 从平台后台数据库/配置中获取域名与S3子文件夹的映射关系
          const domainFolderMap = {
              "client1.com": "client1-site",
              "client2.com": "client2-site"
          };
          
          const targetFolder = domainFolderMap[host];
          if (targetFolder) {
              // 重写请求路径,前缀添加对应子文件夹
              request.uri = `/${targetFolder}${request.uri}`;
              // 根路径自动指向index.html
              if (request.uri === `/${targetFolder}/`) {
                  request.uri = `/${targetFolder}/index.html`;
              }
          }
          
          return request;
      }
      
    • 将函数关联到分发的「Viewer Request」触发器,确保请求到达时立即完成路径重写。

3. 用户DNS配置引导

  • 告知用户在其域名服务商的DNS控制台添加对应记录:
    • 子域名(如blog.client1.com):添加CNAME记录,将域名指向CloudFront分发域名(如d1234abc.cloudfront.net)。
    • 顶级域名(如client1.com):若服务商支持CNAME flattening,直接使用CNAME;否则需将域名托管到Route 53,添加别名记录指向CloudFront分发。

方案优势(对比原有方案)

  • 对比方案1(自有服务器):无需自行维护SSL证书,ACM自动续期;依托CloudFront全球CDN节点,性能远超自有服务器;S3存储可靠性更高。
  • 对比方案2(单CloudFront分发无自定义域名):通过路径重写+自定义域名配置,用户直接使用自有域名访问,完全匹配Wix/Webflow的用户体验。

注意事项

  • 域名与子文件夹的映射关系需在平台后台维护,新增用户域名时同步更新配置(或通过动态拉取数据库实现)。
  • 若用户数量较多,可使用ACM多域名证书(单证书最多支持100个域名),或批量申请独立证书。
  • CloudFront Functions适合简单路径重写逻辑,成本更低;复杂场景(如动态从数据库拉取映射)建议使用Lambda@Edge。

内容的提问来源于stack exchange,提问作者John Brzenk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 12:45:37