2014-10-14 13 views
6

Mam problem z Chrome, którego nie mogę w pełni zrozumieć. Ciekawi mnie, czy ludzie już wcześniej z nim rozmawiali. To się nie powiela w Firefoksie. Kroki są następujące:Chrome + CORS + pamięć podręczna - żądanie tego samego pliku z dwóch różnych źródeł.

  1. start incognito Chrome, przejdź do https://foo.mysite.com i mają JS na stronie złożyć zamówienie Pobierz ajax do S3 dla https://s3.amazonaws.com/mystuff/file.json. Wrócisz odpowiedź 200 ze:

    HTTP/1.1 200 OK 
    x-amz-id-2: somestuffhere 
    x-amz-request-id: somestuffhere 
    Date: Tue, 14 Oct 2014 03:06:41 GMT 
    Access-Control-Allow-Origin: https://foo.mysite.com 
    Access-Control-Allow-Methods: GET 
    Access-Control-Max-Age: 3000 
    Access-Control-Allow-Credentials: true 
    Vary: Origin, Access-Control-Request-Headers, Access-Control-Request-Method 
    Cache-Control: max-age=86400 
    Content-Encoding: gzip 
    Last-Modified: Sun, 05 Oct 2014 00:29:53 GMT 
    ETag: "fe76607baa40a793eb3b3cbd373a3fb8" 
    Accept-Ranges: bytes 
    Content-Type: application/json 
    Content-Length: 5609 
    Server: AmazonS3 
    
  2. otworzyć drugi języczek, przejdź do https://bar.mysite.com i mieć JS złożyć zamówienie Pobierz ajax do S3 dla tego samego pliku https://s3.amazonaws.com/mystuff/file.json. Wracaj następującą odpowiedź: 304

    HTTP/1.1 304 Not Modified 
    x-amz-id-2: somestuffhere 
    x-amz-request-id: somestuffhere 
    Date: Tue, 14 Oct 2014 03:06:58 GMT 
    Access-Control-Allow-Origin: https://bar.mysite.com 
    Access-Control-Allow-Methods: GET 
    Access-Control-Max-Age: 3000 
    Access-Control-Allow-Credentials: true 
    Vary: Origin, Access-Control-Request-Headers, Access-Control-Request-Method 
    Cache-Control: max-age=86400 
    Last-Modified: Sun, 05 Oct 2014 00:29:53 GMT 
    ETag: "fe76607baa40a793eb3b3cbd373a3fb8" 
    Server: AmazonS3 
    
  3. Otwórz zakładkę trzecie, przejdź do https://foo.mysite.com (pierwsze miejsce) i powtórzyć te same czynności, jak w 1. Chrome zabija odpowiedzi na Cors powodów i podaje następujące:

    XMLHttpRequest cannot load https://s3.amazonaws.com/mystuff/file.json. The 'Access-Control-Allow-Origin' header has a value 'https://bar.mysite.com' that is not equal to the supplied origin. Origin 'https://foo.mysite.com' is therefore not allowed access. 
    

co chodzi tutaj? To się nie powiela w Firefoksie. W Firefoksie z przyjemnością uzyskuję 304 w obu etapach 2 i 3, co spodziewam się zobaczyć również w Chrome.

Tymczasowym obejściem tego problemu w Chrome jest ustawienie Cache-Control: no-cache na pliku w S3, ale potem zmuszam naszych klientów do ponownego pobierania tego pliku bez ważnego powodu, więc to nie jest prawdziwe rozwiązanie.

Czy jest to zamierzone i udokumentowane zachowanie? Czy to błąd w Chrome? Jakieś inne myśli?

+0

to brzmi podobnie jak problem z buforowaniem proxy, z tym że nagłówek 'Vary' jest ustawiony na odpowiedź, co powinno zapobiec problemowi z buforowaniem proxy. Czy możesz sprawdzić i udostępnić nagłówki odpowiedzi w odpowiedzi nr 3 (odpowiedź nieudana)? – monsur

+0

Żądanie nie zostanie odebrane z serwera, ponieważ Chrome anuluje żądanie. Pokazuje tymczasowe nagłówki żądań i najlepsze, a te nie są zbyt pomocne. Próbowałem sprawdzić, czy być może przechwycenie przez chrome: // net-internals doprowadziłoby do zobaczenia odpowiedzi, ale też nigdy nie pominie tej prośby. –

+0

s/żądanie/odpowiedź/w pierwszym zdaniu powyżej. –

Odpowiedz

0

Wygląda to jest spowodowane Chromium issue 260239

+0

Interesujące. Zastanawiam się, dlaczego druga prośba się udaje. Czy nie powinno to zawieść, ponieważ pierwsza odpowiedź jest buforowana? – monsur

+0

Z pewnością nie jest jasne, dlaczego tak się dzieje tylko na 3. żądanie. –

+0

To samo dzieje się z nami w FF. Wierzę, że może to być związane z brakiem nagłówka Vary. – Greg

0

po prostu dodać znacznik czasu w adresie URL żądania, aby wymusić załadowanie aktywo z S3 znowu, a nie z pamięci podręcznej, takie jak „xxxx? Timestamp = yyyy”

+0

co, jeśli adres URL żądania to "https: // {nazwa-wiadka} .s3.amazonaws.com /" i zostanie użyty jako działanie formularza, czy to też zadziała? –