Questo è un po 'più complicato di quanto indichi la risposta accettata.
Il supporto CORS quando si utilizza Cloudfront + S3 è effettivamente implementato in S3 e funziona così secondo Amazon:
L'intestazione Origin della richiesta deve corrispondere a un elemento AllowOrigin.
Il metodo di richiesta (ad esempio, GET o PUT) o l'intestazione del metodo di richiesta di controllo di accesso nel caso in cui una richiesta OPTIONS di verifica preliminare debba essere uno degli elementi consentiti.
Ogni intestazione elencata nell'intestazione Access-Control-Request-Headers della richiesta nella richiesta di verifica preliminare deve corrispondere a un elemento AllowHeader.
Ciò ha senso, ciò che potrebbe non essere chiaro è che se nessuna intestazione Origin viene inviata dal client, questa elaborazione non viene eseguita affatto. E stiamo usando Cloudfront di fronte che, se stai solo ospitando risorse statiche, probabilmente lo hai impostato per ignorare tutte le intestazioni durante la memorizzazione nella cache. Pertanto, se la prima richiesta a ciascun file da un nodo perimetrale specifico non include l'intestazione Origin, memorizzerà nella cache la risposta senza l'intestazione Access-Control-Allow-Origin.
Il risultato è che la prima richiesta in arrivo determinerà quali intestazioni vengono restituite per tutte le richieste fino alla scadenza della cache.
Esistono diversi modi per risolvere questo problema.
- Installa cloudfront per eseguire la memorizzazione nella cache condizionale in base all'intestazione "Origine".
Funziona bene se ti aspetti solo poche o una singola origine, ma in caso contrario il rapporto di memorizzazione nella cache potrebbe peggiorare.
- Usa Lambda @ edge per impostare forzatamente le intestazioni, questo può essere fatto solo una volta per ogni richiesta di origine (S3).
Completamente flessibile, ma aggiunge costi generali e costi.
- Rendi cloudfront sovrascrive l'intestazione "Origin" su un valore fittizio per ogni richiesta.
Questo è davvero utile solo nel caso "Access-Control-Allow-Origin: *" ed è un po 'un trucco, ma è probabilmente la migliore soluzione attuale quando si ospitano risorse statiche su cloudfront + S3.