Ini sedikit lebih rumit daripada jawaban yang diterima menunjukkan.
Dukungan CORS saat menggunakan Cloudfront + S3 sebenarnya diimplementasikan dalam S3 dan berfungsi seperti ini menurut Amazon:
Header Asal permintaan harus cocok dengan elemen DiizinkanOrigin.
Metode permintaan (misalnya, DAPATKAN atau PUT) atau header Metode-Akses-Kontrol Permintaan jika permintaan PILIHAN prelight harus menjadi salah satu elemen Diizinkan Metode.
Setiap tajuk yang tercantum dalam tajuk Akses-Kontrol-Permintaan-Tajuk pada permintaan preflight harus cocok dengan elemen AllowHeader.
Ini masuk akal, yang mungkin tidak jelas adalah bahwa jika tidak ada header Asal dikirim oleh klien, maka pemrosesan ini tidak dilakukan sama sekali. Dan kami menggunakan Cloudfront di depan yang, jika Anda hanya meng-host aset statis, Anda mungkin mengaturnya untuk mengabaikan semua header saat melakukan caching. Oleh karena itu jika permintaan pertama untuk setiap file dari node tepi tertentu tidak termasuk header Origin, itu akan men-cache respon tanpa header Access-Control-Allow-Origin.
Hasilnya adalah bahwa permintaan masuk pertama akan menentukan header mana yang dikembalikan untuk semua permintaan sampai cache berakhir.
Ada beberapa cara untuk memperbaikinya.
- Setup cloudfront untuk melakukan caching bersyarat berdasarkan header "Asal".
Ini berfungsi dengan baik jika Anda hanya mengharapkan beberapa atau satu asal saja, tetapi sebaliknya rasio cache Anda bisa menjadi sangat buruk.
- Gunakan Lambda @ edge untuk mengatur header secara paksa, ini bisa dilakukan hanya sekali untuk setiap permintaan asal (S3).
Sepenuhnya fleksibel, tetapi menambah overhead dan biaya.
- Buat cloudfront menimpa tajuk "Asal" ke nilai dummy untuk setiap permintaan.
Ini hanya benar-benar berguna dalam kasus "Access-Control-Allow-Origin: *" dan ini sedikit meretas, tetapi ini mungkin solusi terbaik saat ini ketika hosting aset statis di cloudfront + S3.