Cloudfront'ta Access-Control-Allow-Origin Ayarlama


15

AWS Cloudfront kullanarak Firefox'a statik varlıklar sunmakta sorun yaşıyorum.

Chrome mükemmel çalışıyor, ancak Firefox bir CORS hatası döndürüyor.

Curl yürütürsem, şunu elde ederim:

HTTP/1.1 200 OK
Content-Type: application/x-font-opentype
Content-Length: 39420
Connection: keep-alive
Date: Mon, 11 Aug 2014 21:53:50 GMT
Cache-Control: public, max-age=31557600
Expires: Sun, 09 Aug 2015 01:28:02 GMT
Last-Modified: Fri, 08 Aug 2014 19:28:05 GMT
ETag: "9df744bdf9372cf4cff87bb3e2d68fc8"
Accept-Ranges: bytes
Server: AmazonS3
Age: 2743
X-Cache: Hit from cloudfront
Via: 1.1 c445b20dfbf3128d810e975e5d84e2cd.cloudfront.net (CloudFront)
X-Amz-Cf-Id: ...

Hangi başlık gerektiğini düşünüyorum:

Access-Control-Allow-Origin: *

Biri bana yardım edebilir mi? Chrome'da değil, Firefox'ta neden bir sorun var? Nasıl çözebilirim?

Yanıtlar:


18

İlk olarak, başlangıç ​​başlığını beyaz listeye eklediğinizden emin olmanız gerekir:

CloudFront'un çapraz kaynak paylaşım ayarlarına uymasını istiyorsanız, CloudFront'u Orijin başlığını orijininize iletecek şekilde yapılandırın.

http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/RequestAndResponseBehaviorCustomOrigin.html#request-custom-cors

Ayrıca bkz: http://aws.amazon.com/blogs/aws/enhanced-cloudfront-customization/

Bu arada, serverfault / stackoverflow ve birçok cevap hakkında birkaç benzer soru var.


4

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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.