Rilevare un reindirizzamento in jQuery $ .ajax?

Voglio usare jQuery per ottenere un URL e verificare esplicitamente se ha risposto con un reindirizzamento 302, ma non seguire il reindirizzamento.

$.ajax jQuery sembra seguire sempre i reindirizzamenti. Come posso evitare questo e vedere il reindirizzamento senza seguirlo?

Ci sono varie domande con titoli come “jquery ajax redirect”, ma sembrano implicare il raggiungimento di qualche altro objective, piuttosto che controllare direttamente lo stato fornito da un server.

La richiesta AJAX non ha mai l’opportunità di NON seguire il reindirizzamento (cioè, deve seguire il reindirizzamento). Ulteriori informazioni possono essere trovate in questa risposta https://stackoverflow.com/a/2573589/965648

Benvenuto nel futuro!

Al momento abbiamo una proprietà “responseURL” dall’object xhr. SÌÌ!

Vedi Come ottenere l’URL di risposta in XMLHttpRequest?

Tuttavia, jQuery (almeno 1.7.1) non dà direttamente accesso all’object XMLHttpRequest. Puoi usare qualcosa come questo:

 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); } }); 

Non è una soluzione pulita e suppongo che il team di jQuery creerà qualcosa per responseURL nelle versioni future.

SUGGERIMENTO : basta confrontare l’URL originale con responseUrl. Se è uguale, non è stato dato alcun reindirizzamento. Se è “non definito”, responseUrl probabilmente non è supportato. Tuttavia, come ha detto Nick Garvey, la richiesta AJAX non ha mai l’opportunità di NON seguire il reindirizzamento, ma è ansible risolvere un certo numero di attività utilizzando la proprietà responseUrl .

Mentre gli altri che hanno risposto a questa domanda sono (purtroppo) corretti dal fatto che queste informazioni sono nascoste a noi dal browser, ho pensato di pubblicare una soluzione alternativa che ho trovato:

Ho configurato la mia app server per impostare un’intestazione di risposta personalizzata ( X-Response-Url ) contenente l’URL richiesto. Ogni volta che il mio codice ajax riceve una risposta, controlla se xhr.getResponseHeader("x-response-url") è definito, nel qual caso lo confronta con l’url originariamente richiesto tramite $.ajax() . Se le stringhe differiscono, so che c’era un reindirizzamento, e in aggiunta a quale URL siamo effettivamente arrivati.

Questo ha lo svantaggio di richiedere qualche aiuto sul lato server, e può anche guastarsi se l’url viene mungato (a causa di problemi di quotazione / codifica, ecc.) Durante il viaggio di andata … ma per il 99% dei casi, sembra ottenere il lavoro fatto


Sul lato server, il mio caso specifico era un’applicazione python che utilizzava il framework web Pyramid, e ho usato il seguente frammento:

 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