C'est un peu plus compliqué que ne l'indique la réponse acceptée.
La prise en charge de CORS lors de l'utilisation de Cloudfront + S3 est en fait implémentée dans S3 et fonctionne comme suit selon Amazon:
L'en-tête Origin de la demande doit correspondre à un élément AllowedOrigin.
La méthode de demande (par exemple, GET ou PUT) ou l'en-tête Access-Control Request-Method dans le cas où une demande OPTIONS de contrôle en amont doit être l'un des éléments AllowedMethod.
Chaque en-tête répertorié dans l'en-tête Access-Control-Request-Headers de la demande sur la demande de contrôle en amont doit correspondre à un élément AllowedHeader.
Cela est logique, ce qui peut ne pas être clair, c'est que si aucun en-tête Origin n'est envoyé par le client, ce traitement n'est pas du tout effectué. Et nous utilisons Cloudfront en face qui, si vous hébergez uniquement des actifs statiques, vous l'avez probablement configuré pour ignorer tous les en-têtes lors de la mise en cache. Par conséquent, si la première demande à chaque fichier à partir d'un nœud périphérique spécifique n'inclut pas l'en-tête Origin, il mettra en cache la réponse sans l'en-tête Access-Control-Allow-Origin.
Le résultat est que la première demande entrante déterminera quels en-têtes sont retournés pour toutes les demandes jusqu'à l'expiration du cache.
Il existe plusieurs façons de résoudre ce problème.
- Configurez cloudfront pour effectuer une mise en cache conditionnelle basée sur l'en-tête "Origin".
Cela fonctionne bien si vous ne vous attendez qu'à quelques-unes ou à une seule origine, mais sinon votre taux de mise en cache pourrait devenir très mauvais.
- Utilisez Lambda @ edge pour définir de force les en-têtes, cela ne peut être effectué qu'une seule fois pour chaque demande d'origine (S3).
Entièrement flexible, mais ajoute des frais généraux et des coûts.
- Faites en sorte que cloudfront remplace l'en-tête "Origin" par une valeur fictive pour chaque demande.
Cela n'est vraiment utile que dans le cas "Access-Control-Allow-Origin: *" et c'est un peu un hack, mais c'est probablement la meilleure solution actuelle lors de l'hébergement d'actifs statiques sur cloudfront + S3.