Impedisci il reindirizzamento di Xmlhttprequest


112

È possibile impedire al browser di seguire i reindirizzamenti durante l'invio di XMLHttpRequest-s (cioè per recuperare il codice di stato del reindirizzamento e gestirlo da solo)?

Risposte:


102

Non conforme allo standard W3C per l'oggetto XMLHttpRequest (enfasi aggiunta):

Se la risposta è un reindirizzamento HTTP:

Se l'origine dell'URL trasmessa dall'intestazione Location è la stessa origine dell'origine XMLHttpRequest e il reindirizzamento non viola le precauzioni del ciclo infinito, seguire in modo trasparente il reindirizzamento osservando le regole dell'evento di richiesta della stessa origine.

Lo stavano considerando per una versione futura:

Questa specifica non include le seguenti caratteristiche che vengono prese in considerazione per una versione futura di questa specifica:

  • Proprietà per disabilitare i seguenti reindirizzamenti;

ma l' ultima specifica non lo menziona più.


5
Ciò che è ridicolo è quando il reindirizzamento trasparente comporta la sovrascrittura di alcune intestazioni HTTP impostate nella richiesta originale. In particolare, se l'intestazione "Accetta" è stata impostata su un tipo di contenuto specifico, Firefox non riesce a includere questa intestazione quando si segue il reindirizzamento (il che rende un po 'più difficile sviluppare servizi Web basati su REST che utilizzano questa intestazione ... brontolare).
ruquay

1
Altre ricerche mi hanno portato a questa segnalazione di bug piuttosto vecchia: bugzilla.mozilla.org/show_bug.cgi?id=401564
ruquay

2
D'accordo, difetto di progettazione totalmente ridicolo.
Rasive

35

Il nuovo Fetch API supporta diverse modalità di gestione di reindirizzamento: follow, error, e manual, ma non riesco a trovare un modo per visualizzare il nuovo URL o il codice di stato quando il reindirizzamento è stato annullato. Puoi semplicemente interrompere il reindirizzamento stesso e quindi sembra un errore (risposta vuota). Se è tutto ciò di cui hai bisogno, sei a posto. Inoltre si dovrebbe essere consapevoli del fatto che le richieste effettuate tramite questa API non sono annullabile ancora . Adesso lo sono .

Per quanto riguarda XMLHttpRequest, puoi controllare HEADil server e controllare se l'URL è cambiato:

var http = new XMLHttpRequest();
http.open('HEAD', '/the/url');
http.onreadystatechange = function() {
    if (this.readyState === this.DONE) {
        console.log(this.responseURL);
    }
};
http.send();

Non otterrai il codice di stato, ma troverai il nuovo URL senza scaricare l'intera pagina da esso.


A volte l'utilizzo OPTIONSpuò essere una scelta migliore, comunque funziona solo per scopi non generali, ecc. L'amministratore aveva configurato il reindirizzamento dell'intero sito / schema, come HTTP -> HTTPS
William Leung

12

Puoi utilizzare la responseURLproprietà per ottenere la destinazione di reindirizzamento o verificare se la risposta è stata infine recuperata da una posizione che accetti.
Ciò ovviamente significa che il risultato viene comunque recuperato, ma almeno puoi ottenere le informazioni necessarie sulla destinazione del reindirizzamento e, ad esempio, rilevare le condizioni in cui desideri scartare la risposta.



11

No, non c'è alcun posto nell'API esposto da XMLHttpRequest che ti permetta di sovrascrivere il suo comportamento predefinito di seguire automaticamente un 301 o 302.

Se il client esegue IE su Windows, puoi utilizzare WinHTTP invece per impostare un'opzione per impedire quel comportamento, ma questa è una soluzione molto limitante.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.