2014-10-14 10 views
6

Ich habe ein Problem mit Chrome, das ich nicht vollständig verstehen kann, ich bin neugierig, ob die Leute hier schon einmal damit umgegangen sind. Dies reproduziert sich nicht in Firefox. Die Schritte sind wie folgt:Chrome + CORS + Cache - Anfordern der gleichen Datei von zwei verschiedenen Ursprüngen

  1. starten inkognito Chrome, navigieren Sie zu https://foo.mysite.com und haben die JS auf der Seite eine GET-Ajax-Request für https://s3.amazonaws.com/mystuff/file.json bis S3 machen. Sie erhalten wieder eine 200-Antwort mit:

    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. Öffnen Sie eine zweite Registerkarte zu https://bar.mysite.com navigieren und haben seine JS eine GET-Ajax-Anforderung für die gleiche Datei https://s3.amazonaws.com/mystuff/file.json bis S3 zu machen. Holen Sie sich das folgende 304 Antwort zurück:

    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. Öffnen Sie eine dritte Registerkarte, navigieren Sie zu https://foo.mysite.com (die erste Seite) und wiederholen Sie die gleichen Schritte wie in 1. Chrome die Antwort für CORS Gründen tötet und meldet folgende Möglichkeiten:

    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. 
    

Was ist die Geschichte hier? Dies reproduziert sich nicht in Firefox. In Firefox bekomme ich glücklich eine 304 in beiden Schritten 2 und 3, die ich auch in Chrome erwarten würde.

Eine vorübergehende Lösung für dieses Problem in Chrome Cache-Control zu setzen: no-cache auf die Datei in S3, aber ich zwingen unsere Kunden dann erneut das Herunterladen ohne guten Grund, diese Datei werden, Es ist also keine echte Lösung.

Ist dies beabsichtigt und dokumentiert Verhalten? Ist das ein Bug mit Chrome? Irgendwelche anderen Gedanken?

+0

Das klingt wie ein Proxy-Caching-Problem, außer dass der 'Vary'-Header auf die Antwort gesetzt ist, was das Proxy-Caching-Problem verhindern sollte. Können Sie die Antwortheader auf Antwort 3 (die fehlgeschlagene Antwort) überprüfen und freigeben? – monsur

+0

Die Anforderung wird niemals vom Server empfangen, da Chrome die Anforderung abbricht. Es zeigt provisorische Anfrage Header und am besten, und diese sind nicht sehr hilfreich. Ich habe versucht zu sehen, ob vielleicht Capture durch chrome: // net-Internals hätte die Antwort zu sehen, aber es geht auch nie über die Anfrage dort. –

+0

s/Anfrage/Antwort/im ersten Satz oben. –

Antwort

0

Sieht aus wie dies durch Chromium issue 260239

+0

Interessant. Ich frage mich, warum die zweite Anfrage erfolgreich ist. Sollte es nicht fehlschlagen, seit die erste Antwort zwischengespeichert ist? – monsur

+0

Es ist definitiv nicht klar, warum dies nur bei der 3. Anfrage passiert. –

+0

Das passiert uns auch in FF. Ich glaube, es könnte mit dem Fehlen eines Vary-Headers zusammenhängen. – Greg

0

verursacht ich wieder nur einen Zeitstempel in Anforderungs-URL hinzufügen zu zwingen, den Vermögenswert von S3 zu laden, nicht aus dem Cache, wie „xxxx? Timestamp = yyyy“

+0

Was ist, wenn die Anfrage-URL 'https: // {Bucket-Name} .s3.amazonaws.com /' ist und als Formularaktion verwendet wird, funktioniert das auch? –