web-dev-qa-db-fra.com

Empêcher la redirection de Xmlhttprequest

Est-il possible d'empêcher le navigateur de suivre les redirections lors de l'envoi de XMLHttpRequest-s (c'est-à-dire de récupérer le code d'état de redirection et de le gérer moi-même)?

102
Zim

Pas selon la norme W3C pour l'objet XMLHttpRequest (italique ajouté):

Si la réponse est une redirection HTTP:

Si l'origine de l'URL véhiculée par l'en-tête Location est la même origine que l'origine XMLHttpRequest et que la redirection ne viole pas les précautions de boucle infinie, suivez de manière transparente la redirection tout en respectant les règles d'événement de demande de même origine.

Ils étaient considérant pour une future version:

Cette spécification n'inclut pas les fonctionnalités suivantes qui sont envisagées pour une future version de cette spécification:

  • Propriété pour désactiver les redirections suivantes;

mais la spécification latest ne le mentionne plus.

96
Boy Baukema

Le nouveau Fetch API prend en charge différents modes de gestion de la redirection: follow, error et manual, mais je ne trouve pas de moyen d'afficher la nouvelle URL ou le code d'état lorsque la redirection a été annulée. Vous pouvez simplement arrêter la redirection elle-même, puis cela ressemble à une erreur (réponse vide). Si c'est tout ce dont vous avez besoin, vous êtes prêt à partir. Vous devez également savoir que les demandes effectuées via cette API ne sont pas annulables pour l'instant .  Ils sont maintenant.

Quant à XMLHttpRequest, vous pouvez HEAD le serveur et vérifier si l'URL a changé:

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

Vous n'obtiendrez pas le code d'état, mais vous trouverez la nouvelle URL sans télécharger la page entière.

30
user

Vous pouvez utiliser la propriété responseURL pour obtenir la destination de redirection ou vérifier si la réponse a finalement été récupérée à partir d'un emplacement que vous acceptez.
Cela signifie bien sûr que le résultat est récupéré de toute façon, mais au moins vous pouvez obtenir les informations nécessaires sur la destination de redirection et par exemple détecter les conditions lorsque vous souhaitez ignorer la réponse.

12
Roland Pihlakas

Non, il n'y a aucune place dans l'API exposée par XMLHttpRequest qui vous permet de remplacer son comportement par défaut de suivre un 301 ou 302 automatiquement.

Si le client exécute IE sur Windows, vous pouvez utiliser WinHTTP à la place pour définir une option pour empêcher ce comportement mais c'est une solution très limitative.

11
AnthonyWJones