回答:
AJAX要求には、リダイレクトに従わない機会はありません(つまり、リダイレクトに従う必要があります)。詳細については、この回答をご覧くださいhttps://stackoverflow.com/a/2573589/965648
未来へようこそ!
現在、xhrオブジェクトの "responseURL"プロパティがあります。わーい!
XMLHttpRequestで応答URLを取得する方法を参照してください。
ただし、jQuery(少なくとも1.7.1)では、XMLHttpRequestオブジェクトに直接アクセスできません。次のようなものを使用できます。
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);
}
});
これはクリーンなソリューションではなく、jQueryチームは今後のリリースでresponseURLのために何かを作ると思います。
ヒント:元のURLとresponseUrlを比較するだけです。等しい場合、リダイレクトは行われませんでした。「未定義」の場合、responseUrlはおそらくサポートされていません。ただし、Nick Garvey氏が言ったように、AJAXリクエストにはリダイレクトをたどらない機会はありませんが、responseUrlプロパティを使用していくつかのタスクを解決できます。
この質問に答えた他の人々は(悲しいことに)この情報がブラウザによって非表示にされていることは正しいですが、私が思いついた回避策を投稿すると思いました:
カスタム応答ヘッダーを設定するようにサーバーアプリを構成しました(X-Response-Url
要求されたURLを含む)をしました。私のajaxコードが応答を受信するたびに、それxhr.getResponseHeader("x-response-url")
が定義されているかどうかを確認します。定義されている場合は、最初に経由してリクエストしたURLと比較します$.ajax()
ます。文字列が異なる場合は、リダイレクトがあったことと、実際に到達したURLがわかります。
これには、サーバー側のヘルプが必要になるという欠点があり、また、往復中にURLが変更されると(引用符/エンコードの問題などにより)機能しなくなる可能性があります...しかし、99%の場合、これは仕事は終わりました。
サーバー側では、私の特定のケースはPyramid Webフレームワークを使用するPythonアプリケーションであり、次のスニペットを使用しました。
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