Bu, kabul edilen cevabın gösterdiğinden biraz daha karmaşıktır.
Cloudfront + S3 kullanırken CORS desteği aslında S3'te uygulanmaktadır ve Amazon'a göre şu şekilde çalışır:
İsteğin Origin başlığı, bir AllowOrigin öğesiyle eşleşmelidir.
Bir ön kontrol OPTIONS isteğinin İzin Verilen Yöntem öğelerinden biri olması durumunda istek yöntemi (örneğin, GET veya PUT) veya Erişim Denetimi İsteği Yöntemi başlığı.
Ön kontrol isteğindeki isteğin Erişim-Denetim-İstek-Başlıkları üstbilgisinde listelenen her üstbilginin, İzin VerilenHeader öğesiyle eşleşmesi gerekir.
Bu mantıklıdır, net olmayan şey, istemci tarafından hiçbir Orijin başlığı gönderilmezse, bu işlemin hiç yapılmamasıdır. Cloudfront'u, yalnızca statik varlıkları barındırıyorsanız, büyük olasılıkla önbelleğe alırken tüm başlıkları yok sayacak şekilde ayarladığınız önden kullanıyoruz. Bu nedenle, belirli bir kenar düğümünden her dosyaya yönelik ilk istek Origin üstbilgisini içermiyorsa, Access-Control-Allow-Origin üstbilgisi olmadan yanıtı önbelleğe alır.
Sonuç olarak, gelen ilk istek, önbellek sona erene kadar tüm istekler için hangi başlıkların döndürüleceğini belirler.
Bunu düzeltmenin / geçici çözümün birkaç yolu vardır.
- "Origin" başlığına göre koşullu önbellekleme yapmak için cloudfront'u ayarlayın.
Yalnızca birkaç veya tek bir kaynak bekliyorsanız, bu iyi çalışır, ancak aksi takdirde önbellek oranınız gerçekten kötü olabilir.
- Başlıkları zorla ayarlamak için Lambda @ edge kullanın, bu her başlangıç (S3) isteği için yalnızca bir kez yapılabilir.
Tamamen esnek, ancak ek maliyet ve maliyet ekler.
- Cloudfront'un "Origin" başlığını her istek için sahte bir değere göre geçersiz kılın.
Bu yalnızca "Access-Control-Allow-Origin: *" durumunda gerçekten yararlıdır ve biraz hack'tir, ancak cloudfront + S3'te statik varlıkları barındırırken muhtemelen en iyi geçerli çözümdür.