Empêcher la redirection de Xmlhttprequest

112

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 la redirection et de le gérer moi-même)?

Zim
la source

Réponses:

102

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

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 observant les règles d'événement de demande de même origine.

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

Garçon Baukema
la source
5
Ce qui est ridicule, c'est lorsque la redirection transparente implique l'écrasement de certains en-têtes HTTP définis dans la requête d'origine. Plus précisément, si l'en-tête "Accept" a été défini sur un type de contenu spécifique, Firefox ne parvient pas à inclure cet en-tête lorsqu'il suit la redirection (ce qui rend un peu plus difficile le développement de services Web entièrement basés sur REST qui utilisent cet en-tête ... plaindre).
ruquay
1
Quelques recherches supplémentaires m'ont apporté ce rapport de bogue plutôt ancien: bugzilla.mozilla.org/show_bug.cgi?id=401564
ruquay
2
D'accord, défaut de conception totalement rediculaire.
Rasive
35

La nouvelle Fetch API supports différents modes de traitement des redirect: follow, erroret manual, mais je ne peux pas trouver un moyen de voir 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. Sachez également que les demandes effectuées via cette API ne sont pas encore annulables . Ils le sont maintenant.

Comme pour XMLHttpRequest, vous pouvez HEADle 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 à partir de celle-ci.

utilisateur
la source
Parfois, l'utilisation OPTIONSpeut être un meilleur choix, de toute façon ne fonctionne qu'à des fins non générales, etc. l'administrateur avait configuré la redirection de tout le site / schéma, tel que HTTP -> HTTPS
William Leung
12

Vous pouvez utiliser la responseURLpropriété pour obtenir la destination de la redirection ou vérifier si la réponse a finalement été extraite 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 la redirection et, par exemple, détecter les conditions lorsque vous souhaitez ignorer la réponse.

Roland Pihlakas
la source
11

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

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.

AnthonyWJones
la source