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 : ![CORS config button]()
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 ![adding an origin]()
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
: ![adding a behavior and whitelist headers]()
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.