3

当客户端请求标头包含 Accept-Encoding:gxip、deflate、br 时,S3 + Cloudfromt 不提供 .gz /.br 静态文件。

  1. 构建时的压缩文件和 s3 文件夹包含 index.html、index.html.gz 和 index.html.br
  2. 在 cloudfront 的白名单标头中添加了 Accept 编码。
  3. 在 S3 CORS 配置中添加了 Content-Length
  4. 将 index.html.gz 的内容编码添加为 gzip,将 index.html.br 的内容编码为 br,Content-Type 为 text/html
  5. 在 cloufront 中禁用自动压缩

但我没有从 S3+ cloudfront 获取压缩文件。我可以直接访问 index.html.gz。但 cloudfront+S3 无法自动提供文件。我错过了什么吗?还是不能这样服务?

4

1 回答 1

1

这可以通过 CloudFront -> Lambda@Edge (Origin request) -> S3 来完成。由于提出了这个问题,AWS 添加了 Accept-Encoding 标头以传递给 S3,因此 Lambda 函数可以使用它。

lambda 将采用 accept-encoding 标头,检查 brotli 是否在其中,如果是,它将向 S3 存储桶的请求添加所需的扩展。客户端仍然可以访问相同的 URL,但会根据该接受编码标头获得不同的结果。

此外,请确保您的 CloudFront 缓存策略基于接受编码标头。

Lambda 的示例代码:

'use strict';

/**
 * Funciton registered on 'Origin Request' CloudFront Event
 */
exports.handler = (event, context, callback) => {
  const request = event.Records[0].cf.request;
  const headers = request.headers;
  var isBr = false;
  
  
  if(headers['accept-encoding'] && headers['accept-encoding'][0].value.indexOf('br') > -1) {
    isBr = true;
  }
  const gzipPath = '.gz';
  const brPath = '.br';

  /**
  * Update request path based on custom header
  */  
  request.uri = request.uri + (isBr ? brPath : gzipPath);
  callback(null, request);
};
于 2021-12-28T17:51:30.033 回答