Après quelques ajustements, il semble que cela fonctionne sans le piratage 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 ma configuration pour qu'il soit facile de voir ce que j'ai fait, j'espère que cela aidera les autres.
Informations générales: J'utilise une application Rails qui a le gem asset_sync pour placer des actifs sur S3. Cela inclut les polices.
Dans la console S3, j'ai cliqué sur mon compartiment, mes propriétés et `` modifier la configuration des cors '', ici:
À l'intérieur de 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 pointait vers mon compartiment S3
Puis ajouté un comportement pour qu'un chemin par défaut pointe vers la configuration d'origine basée sur S3 I. J'ai également cliqué sur les en-têtes de la liste blanche et ajouté Origin
:
Ce qui se passe maintenant est le suivant, ce qui, à mon avis, est juste:
1) Vérifiez 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érifiez 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 était un échec de cloudfront car ces fichiers sont mis en cache pendant 180 secondes, mais la même chose fonctionnait sur les hits)
3) Hit cloudfront avec une origine différente (mais une qui est autorisée sur CORS pour le compartiment S3) - le Access-Control-Allow-Origin
n'est pas mis en cache! Yay!
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 piratage de chaîne de requête.
Quand je change l'en-tête Origin, il semble toujours y avoir un X-Cache: Miss from cloudfront
sur la première demande puis après j'obtiens leX-Cache: Hit from cloudfront
PS Il est intéressant de noter que lorsque vous faites curl -I (majuscule I) ne montrera PAS les en-têtes Access-Control-Allow-Origin car il ne s'agit que d'une HEAD, je fais -i pour en faire un GET et faire défiler vers le haut.
Access-Control-Allow-Origin
tête est mis en cache et invalide CORS lorsqu'une demande ultérieure est effectuée via un sous-domaine différent?