Jest to nieco bardziej skomplikowane, niż wskazuje zaakceptowana odpowiedź.
Obsługa CORS podczas korzystania z Cloudfront + S3 jest faktycznie zaimplementowana w S3 i działa zgodnie z Amazon:
Nagłówek Origin żądania musi pasować do elementu AllowedOrigin.
Metoda żądania (na przykład GET lub PUT) lub nagłówek metody żądania kontroli dostępu w przypadku, gdy żądanie OPCJI w ramach inspekcji wstępnej musi być jednym z elementów dozwolonych.
Każdy nagłówek wymieniony w nagłówku żądania kontroli dostępu do nagłówków żądania wstępnego musi być zgodny z elementem AllowedHeader.
Ma to sens, ponieważ może nie być jasne, że jeśli klient nie wysyła nagłówka Origin, wówczas przetwarzanie nie jest w ogóle wykonywane. A my korzystamy z Cloudfront z przodu, który, jeśli tylko hostujesz statyczne zasoby, prawdopodobnie skonfigurowałeś go tak, aby ignorował wszystkie nagłówki podczas buforowania. Dlatego jeśli pierwsze żądanie do każdego pliku z określonego węzła krawędzi nie zawiera nagłówka Origin, buforuje odpowiedź bez nagłówka Access-Control-Allow-Origin.
W rezultacie pierwsze przychodzące żądanie określi, które nagłówki są zwracane dla wszystkich żądań do momentu wygaśnięcia pamięci podręcznej.
Istnieje kilka sposobów rozwiązania tego problemu.
- Skonfiguruj Cloudfront, aby wykonywać warunkowe buforowanie na podstawie nagłówka „Origin”.
Działa to dobrze, jeśli oczekujesz tylko kilku lub jednego źródła, ale w przeciwnym razie twój współczynnik buforowania może być naprawdę zły.
- Użyj Lambda @ edge, aby wymusić ustawienie nagłówków, można to zrobić tylko raz dla każdego żądania źródła (S3).
W pełni elastyczny, ale zwiększa koszty ogólne i koszty.
- Ustaw chmurę nadpisującą nagłówek „Origin” na wartość zastępczą dla każdego żądania.
Jest to naprawdę przydatne tylko w przypadku „Access-Control-Allow-Origin: *” i jest to trochę hack, ale jest to prawdopodobnie najlepsze obecne rozwiązanie, gdy hostujesz zasoby statyczne na chmurze + S3.