2014-10-14 13 views
6

Sto riscontrando un problema con Chrome che non riesco a capire appieno, sono curioso di sapere se la gente lo ha già trattato prima. Questo non si riproduce in Firefox. I passi sono i seguenti:Chrome + cache CORS + - richiesta dello stesso file da due origini diverse

  1. Inizio incognito Chrome, passare a https://foo.mysite.com e avere il JS nella pagina di effettuare una richiesta GET Ajax per S3 per https://s3.amazonaws.com/mystuff/file.json. Si ottiene di nuovo una risposta 200 con:

    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. Aprire una seconda scheda, passare al https://bar.mysite.com e avere i suoi JS fanno una richiesta GET Ajax a S3 per lo stesso file https://s3.amazonaws.com/mystuff/file.json. Ottenere indietro la seguente risposta 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. Aprire una terza scheda, passare al https://foo.mysite.com (il primo sito) e ripetere la stessa procedura in 1. Chrome uccide la risposta per motivi CORS e riporta la seguente:

    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. 
    

Qual è la storia qui? Questo non si riproduce in Firefox. In Firefox sto ottenendo felicemente un 304 in entrambi i passaggi 2 e 3, che mi aspetto di vedere anche in Chrome.

Una soluzione temporanea per questo problema in Chrome è quello di impostare Cache-Control: no-cache sul file in S3, ma poi sto forzando i nostri clienti di essere ri-scaricando il file per nessuna buona ragione, quindi non è una soluzione reale.

Comportamento previsto e documentato? È un bug con Chrome? Qualche altro pensiero?

+0

Questa suoni come un problema di caching del proxy, tranne per il fatto che l'intestazione 'Vary' è impostata sulla risposta, il che dovrebbe impedire il problema del caching del proxy. Puoi controllare e condividere le intestazioni di risposta sulla risposta n. 3 (la risposta negativa)? – monsur

+0

La richiesta non viene mai ricevuta dal server perché Chrome annulla la richiesta. Mostra le intestazioni delle richieste provvisorie e le migliori e quelle non sono di grande aiuto. Ho cercato di capire se catturare tramite chrome: // net-internals avrebbe portato a vedere la risposta, ma non ha mai superato la richiesta. –

+0

s/richiesta/risposta/nella prima frase sopra. –

risposta

0

Sembra che questo è causato da Chromium issue 260239

+0

Interessante. Mi chiedo perché la seconda richiesta abbia successo. Non dovrebbe fallire dal momento che la prima risposta viene memorizzata nella cache? – monsur

+0

Non è chiaro il motivo per cui ciò accade solo sulla terza richiesta. –

+0

Questo ci sta succedendo anche in FF. Credo che possa essere correlato alla mancanza di un header Vary. – Greg

0

Ho solo aggiungere un timestamp nella richiesta URL per forzare caricare l'asset da S3 di nuovo, non dalla cache, come ad esempio "xxxx? Timestamp = yyyy"

+0

e se l'url della richiesta è 'https: // {bucket-name} .s3.amazonaws.com /' e usato come azione modulo, funzionerà anche questo? –