在 CloudFront/S3 中托管 Angular 应用程序 *无需* S3 静态网站托管

Posted

技术标签:

【中文标题】在 CloudFront/S3 中托管 Angular 应用程序 *无需* S3 静态网站托管【英文标题】:Host Angular app in CloudFront/S3 *without* S3 static website hosting 【发布时间】:2022-01-08 12:45:54 【问题描述】:

我正在使用 AWS CDK 构建一个 Angular 应用程序。这是为了我的工作,InfoSec 不赞成公开访问的 S3 存储桶。我想使用新的Distribution API 而不为网站托管配置 S3 存储桶。在这种情况下,“存储桶将作为存储桶来源处理,并将使用 CloudFront 的重定向和错误处理”。当我使用以下代码设置分发时,应用程序的根目录工作(即/index.html)但身份验证重定向(/login/callback)会产生“拒绝访问”XML 响应。如何告诉 CloudFront 将所有内容重定向到 index.html

    const bucket = new Bucket(this, "WebUIBucket", 
      versioned: false,
      removalPolicy: RemovalPolicy.DESTROY,
      autoDeleteObjects: true,
    )

     new BucketDeployment(this, "DeployWebUI", 
      sources: [Source.asset(path.resolve(__dirname, "../../frontend/dist/myapp"))],
      destinationBucket: bucket,
    )

    const cloudFront = new Distribution(this, "CloudFront", 
      defaultBehavior: 
        origin: new S3Origin(bucket),
        viewerProtocolPolicy: ViewerProtocolPolicy.REDIRECT_TO_HTTPS,
      ,
      domainNames: [this.frontendFQDN],
      certificate: this.certificate,
      priceClass: PriceClass.PRICE_CLASS_100,
      defaultRootObject: "index.html",
    

    const zone = HostedZone.fromLookup(this, 'Zone',  domainName: 'my.tld' )

    new ARecord(this, "frontendDNS", 
      zone: this.zone,
      recordName: 'my-angular-app',
      target: RecordTarget.fromAlias(new CloudFrontTarget(cloudFront)),
    

【问题讨论】:

【参考方案1】:

整理好了。感谢this SO question,我发现我必须将我的 CloudFront 分配更新为以下内容:

    const cloudFront = new Distribution(this, "CloudFront", 
      defaultBehavior: 
        origin: new S3Origin(bucket),
        viewerProtocolPolicy: ViewerProtocolPolicy.REDIRECT_TO_HTTPS,
      ,
      domainNames: [this.frontendFQDN],
      certificate: this.certificate,
      priceClass: PriceClass.PRICE_CLASS_100,
      defaultRootObject: "index.html",
      errorResponses: [
        
          httpStatus: 404,
          responseHttpStatus: 200,
          responsePagePath: "/index.html",
        ,
        
          httpStatus: 403,
          responseHttpStatus: 200,
          responsePagePath: "/index.html",
        ,
        
          httpStatus: 400,
          responseHttpStatus: 200,
          responsePagePath: "/index.html",
        ,
      ],
    

我在这里所做的是通过index.html 将错误 400、403 和 404 重定向回 Angular。

【讨论】:

我不能直到明天。 :D

以上是关于在 CloudFront/S3 中托管 Angular 应用程序 *无需* S3 静态网站托管的主要内容,如果未能解决你的问题,请参考以下文章

S3 / Cloudfront 下载限制

CloudFront / S3 ETag:CloudFront 是不是可以在 CF TTL 过期之前发送更新的 S3 对象?

Cloudfront/S3:根据请求标头服务器不同的文件

AWS S3+Cloudfront 访问被拒绝初学者问题

当请求标头具有 CloudFront + S3 网站的“接受编码”时,CORS 标头丢失

CloudFront + S3网站:应显示隐式索引文档时“指定的键不存在”