我要实现的目标是将我的静态资源CSS, JS, images, uploded images
(约1百万)同步到S3 bucket
并使用cloudfront
传递它们。对于同步,我使用的是AWS PHP SDK v2.8x。以下是我的代码:
$folder = $_GET['folder'];
$concurrency = $_GET['concurrency'];
$force = $_GET['force'];
$rootPath = Yii::$app->params['root_path'];
$bucket = 'my-bucket';
$client = S3Client::factory(array(
'key' => "my-key",
'secret' => "my-secret",
'stats' => true
));
$params = array();
$metadata = array();
$options = array();
$params['ACL'] = 'public-read';
//$params['ContentEncoding'] = 'gzip';
$params['Expires'] = 'Wed, 20 Jun 2018 07:48:05 GMT';
$params['CacheControl'] = 'max-age=31536000';
$options['params'] = $params;
$options['concurrency'] = $concurrency;
//$options['debug'] = true;
$options['force'] = $force;
$client->uploadDirectory($rootPath.'/'.$folder, $bucket, $folder, $options);
我已成功将所有内容上传到S3存储桶,并且与cloudfront同步也正常运行。但问题是我无法gzip任何这样的内容导致巨大的页面大小。此外,过期标头也不会反映在云端。如果我启用$params['ContentEncoding'] = 'gzip';
我得到ERR_CONTENT_DECODING_FAILED
。我也对CloudFront设置进行了更改,但似乎没有任何效果。
另外,请帮助我了解同步S3,CloudFront和我的服务器的最佳实践。
我目前的php框架是YII2。
如果需要补充信息,请告诉我,我会进行编辑。
提前致谢。
答案 0 :(得分:2)
$params['ContentEncoding'] = 'gzip';
实际上并没有gzip你的内容 - 它用于表示你在上传之前已经自己解压缩了它。
如果您设置了该内容,并且没有对内容进行gzip,则ERR_CONTENT_DECODING_FAILED
将是正确的。
如果您在CloudFront缓存行为中将“自动压缩对象”设置为“是”,则可以将内容存储在未压缩的S3中,只需让CloudFront对其进行gzip。
正确设置后,为*
执行CloudFront缓存失效,然后再次测试。
另外,请勿设置Expires
标题。你几乎肯定不希望这样。
在检查CloudFront的标头时,请注意Age
。这是多久以前,CloudFront在几秒钟内从S3获取对象。