2015-03-07 9 views
13

sto caricamento di una pagina HTML con alcuni javascript dal sito A.HTTP 302 Redirect a una richiesta CORS è sceso dai browser

Javascript invia una richiesta GET HTTP al sito B. A questo punto:
        - browser invia richiesta relativa alle opzioni del sito B
        - sito B risponde alla richiesta OPTIONS
        - browser invia quindi ori ginal HTTP GET richiesta al sito B
        - sito B risponde con HTTP 302 con la posizione impostata al sito C.

A questo punto Browser arresta l'elaborazione della richiesta. Mi aspettavo che inviasse la richiesta HTTP OPTIONS al sito C proprio come ha fatto quando ha inviato la richiesta al sito B. Ma non è così. Ho osservato lo stesso comportamento su Firefox e Chrome.

Mi piacerebbe capire perché i browser si comportano in questo modo. Capisco che ci dovrebbero essere alcuni controlli o reindirizzamenti max per evitare loop ma non limitato 2 richieste di reindirizzamento.

Anche perché le informazioni dell'intestazione NON sono inviate al codice Javascript in modo che l'applicazione possa fare qualcosa al riguardo. Viene semplicemente rilasciato dal browser anche se ti prende in giro mostrando la risposta HTTP 302 dal sito C con l'URL della posizione nella console del browser.

XMLHttpRequest non può caricare https://siteB/ ... La richiesta è stata reindirizzata a 'https://siteC/ ..', che non è consentita per le richieste di origine incrociata che richiedono il preflight.

Qualsiasi intuizione del design è apprezzata sinceramente.

saluti

+0

ho lo stesso problema, descritto qui: http://stackoverflow.com/questions/41856827/nginx-load-balancer-error-when-302-is-used?noredirect=1#comment70912734_41856827 puoi aiutarmi ? – pier92

risposta

21

Beh, ho avuto lo stesso problema che hai fatto, e, purtroppo, questo comportamento è normale, according to W3C spec

Questa specifica descrive il comportamento del browser per quanto riguarda CORS come stato della macchina, e se si passa al passaggio 3 (facendo la richiesta effettiva), indica chiaramente:

Questa è la richiesta effettiva. Applicare la procedura di richiesta e osservare le regole di richiesta di seguito mentre si effettua la richiesta.

Se la risposta ha un codice di stato HTTP 301, 302, 303, 307 o 308 Applicare la cache e gli errori di rete.

Quindi, se ho capito bene, non possiamo aspettarci che il browser di seguire automaticamente il reindirizzamento in caso di un CORS (presumibilmente, come l'opzione ha concesso l'accesso a un'altra risorsa? Ma allora perché non inviare automaticamente un'altra opzione richiesta a questa risorsa?).

Ciò che è peggio, poiché le HEADERS della risposta sono nascoste dal browser dopo che il reindirizzamento automatico ha avuto esito negativo per il motivo sopra riportato, non abbiamo accesso all'intestazione Location per gestire autonomamente la chiamata successiva alla risorsa corretta. Quindi non c'è modo di recuperare la risorsa reale in questo caso.

Considerato un errore, ma non sono riuscito a trovare alcun post valido sull'argomento sul Web.

Una soluzione alternativa, se possibile, è non eseguire una richiesta CORS ma utilizzare una semplice richiesta (secondo le specifiche di nuovo, ad esempio un semplice GET senza intestazioni personalizzate), che non causerà alcuna richiesta di verifica preliminare da inviare: in questo caso, il reindirizzamento funziona normalmente (seguito automaticamente dal browser).

Altrimenti, è possibile vedere se è possibile ottimizzare il server in modo che non risponda 302 in caso di tipo di richiesta CORS, ma invece di rispondere con un codice HTTP personalizzato che è possibile identificare nel client per includere la posizione di reindirizzamento in il contenuto della risposta per consentire al cliente di seguirlo manualmente.

Se qualcuno ha qualche informazione valida sul perché questo comportamento è, si prega di dare il vostro input :-)

Speranza che aiuta.

+0

Apparentemente la specifica "appena modificata" http://stackoverflow.com/questions/40580913/fetch-api-custom-request-headers-cors-and-cross-origin-redirects (agosto 2016) ma potrebbe non essere stata adottata dal browser ancora: | – rogerdpack

Problemi correlati