2015-07-30 9 views
14

Używam wiadra S3 za Cloudfront z włączonym CORS. Jeśli klient wyśle ​​żądanie z nagłówkiem Origin, to S3 (i cloudfront) zareaguje nagłówkiem "Vary: Origin", jednak jeśli żądanie zostanie wykonane bez nagłówka Origin, odpowiedź nie będzie zawierała Vary Header.S3 CORS, zawsze wyślij Vary: Origin

Jest to problematyczne, ponieważ używam zasobu z chmury/s3 w znaczniku img, w którym to przypadku przeglądarka wysyła żądanie bez nagłówka Origin, a następnie tworzy zapytanie ajax dla tego obrazu. Przeglądarka używa następnie buforowanej wersji obrazu, bez nagłówka Access-Control-Allow-Origin i dlatego odrzuca żądanie.

Czy istnieje sposób, aby S3 zawsze zwracało nagłówek "Vary: Origin"?

+4

Problem został również zgłoszony na [Forach AWS] (https://forums.aws.amazon.com/thread.jspa?messageID=555417򇦙) –

Odpowiedz

6

Innym rozwiązaniem byłoby konfigurowania dystrybucji CloudFront automatycznego włączania dla CORS wnosi do wniosków Cors. Jest to możliwe poprzez dodanie nagłówka CORS do każdego żądania CloudFront wysyła do S3 przy użyciu ostatnio dodaną funkcję CloudFront „Kontrola krawędzi do pochodzenia Nagłówki żądań”.

Zobacz zapowiedź funkcji Tutaj: https://aws.amazon.com/blogs/aws/cloudfront-update-https-tls-v1-1v1-2-to-the-origin-addmodify-headers/

a dokumentacja tutaj: http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/forward-custom-headers.html.

+1

Niezły, że wymusi kontrolę dostępu-pozwól na dostęp, ale w przypadku Vary: Origin? – caub

+1

Jeśli wymusisz Access-Control-Allow-Origin na każdym żądaniu, "Vary: Origin" nie jest już potrzebny, ponieważ nagłówek nie zmienia się już między żądaniami. Nie jest już problematyczne, jeśli przeglądarka używa wersji buforowanej, ponieważ ta wersja jest również włączona w CORS. –

+1

Jednakże, jeśli zmusisz CloudFront do wysyłania zawsze "Origin: X.domena.com" do S3, to nie ma możliwości, aby CloudFront zwrócił "Access-Control-Allow-Origin: Y.domain.com". Innymi słowy, to rozwiązanie nagłówka force działa tylko wtedy, gdy zwracasz nagłówek odpowiedzi wieloznacznej "Access-Control-Allow-Origin: *" lub tylko wracasz do domeny _single_ w nagłówku "Access-Control-Allow-Origin". – timmfin

10

Zrobiłem konto, aby odpowiedzieć na twoje pytanie, ponieważ w przypadku tego rodzaju problemu istnieje niewiele dobrych odpowiedzi (i kilka podobnych).

opisać problem się z jakiegoś powodu głównie w Chrome, FF i IE wydaje się być na tyle mądry, by nie udostępniać pamięci podręcznej między AJAX i regularnych połączeń w tych przypadkach.

Problem

Spójrzmy najpierw opisać dlaczego problem się dla przyszłych czytelników:

  • Browser (Chrome) zwrócić się do serwera przy użyciu zwykłego <img> lub <script> tag. Jeśli serwer znajduje się w tej samej domenie, nie zawiera nagłówków CORS.
  • Serwer (S3) zwraca zasób. Jeśli w żądaniu nie ma nagłówka Origin, nie dołącza on nagłówków CORS do odpowiedzi, ponieważ są one nadmiarowe.
  • Browser (Chrome) i spróbuj ponownie uzyskać zasobu za pomocą AJAX, ale tym razem naprawdę nie iść do serwera, ale wygląda na pamięci podręcznej zasobu.
  • Browser (Chrome) Wersja buforowane nie ma nagłówków Cors. Spowoduje to odrzucenie żądania jako naruszenie Access-Control-Allow-Origin lub inne powiązane problemy.

Rozwiązanie

w HTML5 istnieje atrybut o nazwie crossorigin, który można dodać do tagów oznaczać, że trzeba wysłać informacje dotyczące pochodzenia. Możliwe wartości crossorigin='anonymous' i crossorigin='use-credentials' są zupełnie bez znaczenia na pytanie, ale jak mówi w dokumentacji:

Domyślnie (to znaczy, gdy atrybut nie jest określony), CORS nie jest w ogóle używany.

https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_settings_attributes

Więc wystarczy utworzyć tagi graficzne takie jak ta <img src='cloundfront.path' crossorigin='use-credentials'>

to wszystko. Jest to dość niejasne, więc mam nadzieję, że ta odpowiedź pozwoli zaoszczędzić trochę czasu badawczego grupie ludzi.

+0

Czy mogę mieć rację zakładając, że "crossorigin =" use-credentials "" byłoby równoznaczne z wywołaniem 'withCredentials' na żądanie XHR? Jeśli tak, czy "crossorigin =" anonymous "" działa równie dobrze, jeśli chodzi o zwracanie nagłówków CORS? Wolałbym, aby moje statyczne obrazy nie robiły takich rzeczy jak ustawianie ciasteczek, jeśli mogę pomóc. –

Powiązane problemy