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 pour récupérer le code d'état de redirection et le gérer moi-même)?

Non conforme à la norme W3C pour l'objet XMLHttpRequest (soulignement ajouté):

Si la réponse est une redirection HTTP:

Si l'origine de l'URL véhiculée par l'en-tête d'emplacement est la même origine avec l'origine XMLHttpRequest et la redirection ne viole pas les précautions de boucles infinies, suivre de manière transparente la redirection tout en observant les mêmes règles d'événement de demande d'origine.

Ils l' envisagent pour une version future:

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 dernière spécification ne le mentionne plus.

La nouvelle API Fetch prend en charge différents modes de gestion des redirections: follow , error et manual , mais je ne peux pas trouver un 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, et cela ressemble à une erreur (réponse vide). Si c'est tout ce dont vous avez besoin, vous êtes bien d'aller. De plus, vous devez savoir que les demandes effectuées via cette API ne sont pas encore annulables.

En ce qui concerne 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 trouverez la nouvelle URL sans en télécharger la page entière.

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

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

Vous pouvez utiliser la propriété responseURL pour obtenir la destination de redirection ou vérifier si la réponse a finalement été obtenue à partir d'un emplacement que vous acceptez.
Bien sûr, le résultat est obtenu 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 rejeter la réponse.