Détecter une redirection dans jQuery $ .ajax?

Je veux utiliser jQuery pour obtenir une URL et vérifier explicitement si elle a répondu avec une redirection 302, mais ne pas suivre la redirection.

jQuery $.ajax semble suivre toujours les redirections. Comment puis-je empêcher cela et voir la redirection sans la suivre?

Il y a plusieurs questions avec des titres comme “jquery ajax redirect” mais elles semblent toutes impliquer la réalisation d’un autre objective, plutôt que de vérifier directement l’état donné par un serveur.

La demande AJAX n’a ​​jamais la possibilité de NE PAS suivre la redirection (c.-à-d. Qu’elle doit suivre la redirection). Plus d’informations peuvent être trouvées dans cette réponse https://stackoverflow.com/a/2573589/965648

Bienvenue dans le futur!

En ce moment, nous avons une propriété “responseURL” de l’object xhr. YAY!

Voir Comment obtenir l’URL de réponse dans XMLHttpRequest?

Cependant, jQuery (au moins 1.7.1) ne donne pas directement access à l’object XMLHttpRequest. Vous pouvez utiliser quelque chose comme ceci:

 var xhr; var _orgAjax = jQuery.ajaxSettings.xhr; jQuery.ajaxSettings.xhr = function () { xhr = _orgAjax(); return xhr; }; jQuery.ajax('http://test.com', { success: function(responseText) { console.log('responseURL:', xhr.responseURL, 'responseText:', responseText); } }); 

Ce n’est pas une solution propre et je suppose que l’équipe jQuery fera quelque chose pour responseURL dans les prochaines versions.

CONSEIL : comparez simplement l’URL d’origine avec responseUrl. S’il est égal, aucune redirection n’a été donnée. Si c’est “indéfini”, responseUrl n’est probablement pas supporté. Cependant, comme Nick Garvey l’a dit, la requête AJAX n’a ​​jamais la possibilité de NE PAS suivre la redirection, mais vous pouvez résoudre un certain nombre de tâches en utilisant la propriété responseUrl .

Alors que les autres personnes qui ont répondu à cette question sont (malheureusement) correctes que cette information nous est cachée par le navigateur, j’ai pensé que je posterais une solution de contournement:

J’ai configuré mon application serveur pour définir un en-tête de réponse personnalisé ( X-Response-Url ) contenant l’URL demandée. Chaque fois que mon code ajax reçoit une réponse, il vérifie si xhr.getResponseHeader("x-response-url") est défini, auquel cas il le compare à l’URL demandée à l’origine via $.ajax() . Si les chaînes diffèrent, je sais qu’il y a eu une redirection, et de plus, à quelle url nous sums réellement parvenus.

Cela a l’inconvénient de nécessiter une aide côté serveur, et peut aussi se briser si l’URL est générée (en raison de problèmes de devis / encodage, etc.) pendant l’aller-retour … mais dans 99% des cas, cela semble se produire le travail fait.


Du côté du serveur, mon cas spécifique était une application python utilisant le framework web Pyramid, et j’ai utilisé l’extrait suivant:

 import pyramid.events @pyramid.events.subscriber(pyramid.events.NewResponse) def set_response_header(event): request = event.request if request.is_xhr: event.response.headers['X-Response-URL'] = request.url