Después de algunos ajustes, parece que hice que esto funcione sin el truco de la cadena de consulta. Más información aquí: http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/RequestAndResponseBehaviorS3Origin.html#RequestS3-cors
Voy a revisar toda mi configuración para que sea fácil ver lo que he hecho, espero que esto ayude a otros.
Información básica: estoy usando una aplicación Rails que tiene la gema asset_sync para poner activos en S3. Esto incluye fuentes.
Dentro de la consola S3, hice clic en mi bucket, propiedades y 'editar configuración de cors', aquí:
Dentro del área de texto tengo algo como:
<?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>
Luego, dentro del panel Cloudfront ( https://console.aws.amazon.com/cloudfront/home ) creé una distribución, agregué un Origen que apuntaba a mi cubo S3
Luego agregó un comportamiento para una ruta predeterminada para apuntar al origen basado en S3 que configuré. Lo que también hice fue hacer clic en los encabezados de la Lista blanca y agregar Origin
:
Lo que sucede ahora es lo siguiente, que creo que es correcto:
1) Verifique que los encabezados S3 se estén configurando correctamente
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) Compruebe que Cloudfront funciona con los encabezados
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==
(Tenga en cuenta que lo anterior fue un error de Cloudfront porque estos archivos se almacenan en caché durante 180 segundos, pero lo mismo funcionaba en los hits)
3) Golpee el frente de la nube con un origen diferente (pero que esté permitido en CORS para el bucket S3): ¡ Access-Control-Allow-Origin
no está en caché! ¡Hurra!
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==
Tenga en cuenta que el dominio ha cambiado correctamente sin un hack de cadena de consulta.
Cuando cambio el encabezado Origen, parece que siempre hay un X-Cache: Miss from cloudfront
en la primera solicitud y luego obtengo el esperadoX-Cache: Hit from cloudfront
PD Vale la pena señalar que al hacer curl -I (mayúscula I) NO mostrará los encabezados Access-Control-Allow-Origin, ya que solo es un HEAD, hago -i para que sea un GET y desplácese hacia arriba.
Access-Control-Allow-Origin
encabezado se almacena en caché e invalida CORS cuando se realiza una solicitud posterior a través de un subdominio diferente?