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.