Reputation: 16435
AWS now supports gzipping files through CloudFront
I've followed along with all of the instructions in Serving Compressed Files, and yet gzipping is not working.
I have an S3 bucket set up as a website that CloudFront is using as the origin.
Compress Objects Automatically
is enabledapplication/javascript
and text/css
Content-Length
as far as I knowDespite all this, I can't get gzipping to work. I have gotten everything else including SSL working perfectly, and you can visit the site here: https://formulagrid.com/
If you open up the chrome console, you'll notice that none of the files being served from S3 are being gzipped. The only gzipped files such as the google font are the ones I'm grabbing from other CDNs.
Upvotes: 37
Views: 13411
Reputation: 3866
In my case, the S3 file had some metadata and it had
Content-Encoding
: utf-8
available.
So the cloudfront was just forwarding file as it is without compressing.
Upvotes: 0
Reputation: 224
I had tried all of the above but CloudFront was still not compressing my S3 bucket content.
My problem was that I already had an existing Cloudfront distribution with compression disabled that I later turned on. This somehow didn't allow compression to be taken into account. After a lot of unsuccessful workarounds, I deleted the CloudFront distribution and recreated it with compression on from the get go. This solved my problem.
Upvotes: 0
Reputation: 415
As Cloudfront now only accepts JSON, you have to paste this:
[
{
"AllowedHeaders": [
"Authorization",
"Content-Length"
],
"AllowedMethods": [
"GET"
],
"AllowedOrigins": [
"*"
],
"ExposeHeaders": [],
"MaxAgeSeconds": 3000
}
]
Upvotes: 17
Reputation: 876
My problem was that I uploaded the files specifically with utf-8 encoding. From the documentation:
CloudFront determines whether the file is compressible:
The file must be of a type that CloudFront compresses.
The file size must be between 1,000 and 10,000,000 bytes.
The response must include a Content-Length header so CloudFront can determine whether the size of the file is in the range that CloudFront compresses. If the Content-Length header is missing, CloudFront won't compress the file.
The response must not include a Content-Encoding header.
Upvotes: 8
Reputation: 1253
I hit the same error today and solved it by adding a CORS rule to the S3 bucket. This rule ensures the Content-Length header is sent to Cloudfront so content can be gzipped:
S3 > Bucket > Permissions > CORS Configuration
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>Authorization</AllowedHeader>
<AllowedHeader>Content-Length</AllowedHeader>
</CORSRule>
</CORSConfiguration>
Credit goes to Robert Ellison: http://ithoughthecamewithyou.com/post/enable-gzip-compression-for-amazon-s3-hosted-website-in-cloudfront
As far I know, this seems to be an undocumented requirement.
Upvotes: 53