Après quelques ajustements, il semble que j'ai réussi à faire fonctionner ce système sans l'utilisation de la chaîne de requête. Plus d'informations ici : http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/RequestAndResponseBehaviorS3Origin.html#RequestS3-cors
Je vais passer en revue toute mon installation pour qu'il soit facile de voir ce que j'ai fait, en espérant que cela aidera d'autres personnes.
Informations générales : J'utilise une application Rails qui possède la gemme asset_sync pour placer des actifs sur S3. Cela inclut les polices.
Dans la console S3, j'ai cliqué sur mon bucket, properties et 'edit cors configuration', ici :
Dans la zone de texte, j'ai quelque chose comme :
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>https://*.example.com</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
Ensuite, dans le panneau Cloudfront ( https://console.aws.amazon.com/cloudfront/home ) J'ai créé une distribution, ajouté une origine qui pointe vers mon panier S3
J'ai ensuite ajouté un comportement pour un chemin par défaut qui pointe vers l'origine basée sur S3 que j'ai configurée. J'ai également cliqué sur Whitelist headers et j'ai ajouté Origin
:
La situation actuelle est la suivante, et je pense qu'elle est correcte :
1) Vérifier que les en-têtes S3 sont correctement définis
curl -i -H "Origin: https://example.com" https://s3.amazonaws.com/xxxxxxxxx/assets/fonts/my-cool-font.ttf
HTTP/1.1 200 OK
x-amz-id-2: Ay63Qb5uR98ag47SRJ91+YALtc4onRu1JUJgMTU98Es/pzQ3ckmuWhzzbTgDTCt+
x-amz-request-id: F1FFE275C0FBE500
Date: Thu, 14 Aug 2014 09:39:40 GMT
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Methods: GET
Access-Control-Max-Age: 3000
Access-Control-Allow-Credentials: true
Vary: Origin, Access-Control-Request-Headers, Access-Control-Request-Method
Cache-Control: public, must-revalidate, proxy-revalidate, max-age=180
Last-Modified: Mon, 09 Dec 2013 14:29:04 GMT
ETag: "98918ee7f339c7534c34b9f5a448c3e2"
Accept-Ranges: bytes
Content-Type: application/x-font-ttf
Content-Length: 12156
Server: AmazonS3
2) Vérifier que Cloudfront fonctionne avec les en-têtes
curl -i -H "Origin: https://example.com" https://xxxxx.cloudfront.net/assets/fonts/my-cool-font.ttf
HTTP/1.1 200 OK
Content-Type: application/x-font-ttf
Content-Length: 12156
Connection: keep-alive
Date: Thu, 14 Aug 2014 09:35:26 GMT
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Methods: GET
Access-Control-Max-Age: 3000
Access-Control-Allow-Credentials: true
Cache-Control: public, must-revalidate, proxy-revalidate, max-age=180
Last-Modified: Mon, 09 Dec 2013 14:29:04 GMT
ETag: "98918ee7f339c7534c34b9f5a448c3e2"
Accept-Ranges: bytes
Server: AmazonS3
Vary: Origin
X-Cache: Miss from cloudfront
Via: 1.1 77bdacfea247b6cbe84dffa61da5a554.cloudfront.net (CloudFront)
X-Amz-Cf-Id: cmCxaUcFf3bT48zpPw0Q-vDDza0nZoWm9-_3qY5pJBhj64iTpkgMlg==
(Notez que ce qui précède a été manqué par cloudfront parce que ces fichiers sont mis en cache pendant 180 secondes, mais la même chose a fonctionné pour les hits).
3) Utiliser cloudfront avec une origine différente (mais qui est autorisée par CORS pour le seau S3) - le fichier Access-Control-Allow-Origin
n'est pas mis en cache !
curl -i -H "Origin: https://www2.example.com" https://xxxxx.cloudfront.net/assets/fonts/my-cool-font.ttf
HTTP/1.1 200 OK
Content-Type: application/x-font-ttf
Content-Length: 12156
Connection: keep-alive
Date: Thu, 14 Aug 2014 10:02:33 GMT
Access-Control-Allow-Origin: https://www2.example.com
Access-Control-Allow-Methods: GET
Access-Control-Max-Age: 3000
Access-Control-Allow-Credentials: true
Cache-Control: public, must-revalidate, proxy-revalidate, max-age=180
Last-Modified: Mon, 09 Dec 2013 14:29:04 GMT
ETag: "98918ee7f339c7534c34b9f5a448c3e2"
Accept-Ranges: bytes
Server: AmazonS3
Vary: Origin
X-Cache: Miss from cloudfront
Via: 1.1 ba7014bad8e9bf2ed075d09443dcc4f1.cloudfront.net (CloudFront)
X-Amz-Cf-Id: vy-UccJ094cjdbdT0tcKuil22XYwWdIECdBZ_5hqoTjr0tNH80NQPg==
Notez ci-dessus que le domaine a été modifié avec succès sans qu'une chaîne de requête ne soit modifiée.
Lorsque je modifie l'en-tête Origin, il semble qu'il y ait toujours un X-Cache: Miss from cloudfront
lors de la première demande, puis j'obtiens ensuite le résultat escompté X-Cache: Hit from cloudfront
P.S. Il est intéressant de noter qu'en faisant curl -I (I majuscule), les en-têtes Access-Control-Allow-Origin n'apparaîtront PAS car il s'agit seulement d'un HEAD, je fais -i pour que ce soit un GET et je fais défiler la page vers le haut.