Configuración de Access-Control-Allow-Origin en Cloudfront

15

Tengo problemas para proporcionar activos estáticos a Firefox con AWS Cloudfront.

Chrome funciona perfecto, pero Firefox está devolviendo un error CORS.

Si ejecuto curl, obtengo:

HTTP/1.1 200 OK
Content-Type: application/x-font-opentype
Content-Length: 39420
Connection: keep-alive
Date: Mon, 11 Aug 2014 21:53:50 GMT
Cache-Control: public, max-age=31557600
Expires: Sun, 09 Aug 2015 01:28:02 GMT
Last-Modified: Fri, 08 Aug 2014 19:28:05 GMT
ETag: "9df744bdf9372cf4cff87bb3e2d68fc8"
Accept-Ranges: bytes
Server: AmazonS3
Age: 2743
X-Cache: Hit from cloudfront
Via: 1.1 c445b20dfbf3128d810e975e5d84e2cd.cloudfront.net (CloudFront)
X-Amz-Cf-Id: ...

Lo que creo que necesita el encabezado:

Access-Control-Allow-Origin: *

¿Alguien puede ayudarme? ¿Por qué es un problema en Firefox y no en Chrome? ¿Cómo puedo resolverlo?

Tony
fuente

Respuestas:

18

En primer lugar, debe asegurarse de incluir en la lista blanca el encabezado de origen:

Si desea que CloudFront respete la configuración de uso compartido de recursos de origen cruzado, configure CloudFront para reenviar el encabezado Origen a su origen.

http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/RequestAndResponseBehaviorCustomOrigin.html#request-custom-cors

Ver también: http://aws.amazon.com/blogs/aws/enhanced-cloudfront-customization/

Por cierto, hay varias preguntas similares sobre serverfault / stackoverflow y muchas respuestas.

bjunix
fuente
4

Esto es un poco más complicado de lo que indica la respuesta aceptada.

El soporte de CORS cuando se usa Cloudfront + S3 se implementa realmente en S3 y funciona de esta manera según Amazon:

El encabezado Origen de la solicitud debe coincidir con un elemento AllowOrigin.

El método de solicitud (por ejemplo, GET o PUT) o el encabezado Método de solicitud de control de acceso en caso de que una solicitud OPTIONS de verificación previa sea uno de los elementos de método permitido.

Cada encabezado enumerado en el encabezado de solicitud de control de acceso-solicitud de encabezados en la solicitud de verificación previa debe coincidir con un elemento AllowHeader.

Esto tiene sentido, lo que puede no estar claro es que si el cliente no envía un encabezado Origin, entonces este procesamiento no se realiza en absoluto. Y estamos usando Cloudfront en el frente que, si solo está alojando activos estáticos, probablemente lo haya configurado para ignorar todos los encabezados al almacenar en caché. Por lo tanto, si la primera solicitud a cada archivo desde un nodo de borde específico no incluye el encabezado Origin, almacenará en caché la respuesta sin el encabezado Access-Control-Allow-Origin.

El resultado es que la primera solicitud entrante determinará qué encabezados se devuelven para todas las solicitudes hasta que caduque el caché.

Hay varias formas de solucionar / solucionar esto.

  • Configure Cloudfront para hacer un almacenamiento en caché condicional basado en el encabezado "Origen".

Esto funciona bien si espera solo unos pocos o un solo origen, pero de lo contrario su relación de almacenamiento en caché podría ser realmente mala.

  • Use Lambda @ edge para establecer los encabezados a la fuerza, esto se puede hacer solo una vez para cada solicitud de origen (S3).

Totalmente flexible, pero agrega gastos generales y costos.

  • Haga que Cloudfront anule el encabezado "Origen" a un valor ficticio para cada solicitud.

Esto solo es realmente útil en el caso "Access-Control-Allow-Origin: *" y es un poco hack, pero es probablemente la mejor solución actual cuando se alojan activos estáticos en cloudfront + S3.

Rasmus Larsen
fuente