JQueryを使用してURLをGETし、302リダイレクトで応答したかどうかを明示的に確認したいのですが、notに従ってください。
jQueryの$.ajax
は常にリダイレクトに従うようです。どうすればこれを防ぎ、それに従わずにリダイレクトを見ることができますか?
「jquery ajax redirect」などのタイトルにはさまざまな質問がありますが、それらはすべて、サーバーが提供するステータスを直接確認するだけでなく、他の目標を達成することを伴うようです。
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のために何かを作成すると思います。
TIP:元のURLとresponseUrlを比較するだけです。等しい場合、リダイレクトは行われませんでした。 「未定義」の場合、responseUrlはおそらくサポートされていません。ただし、ニックガーベイが言ったように、AJAXリクエストにはリダイレクトに従わない機会はありませんが、responseUrlプロパティ。
この質問に答えた他の人たちは、この情報がブラウザによって隠されていることを(悲しいことに)正しいのですが、私が思いついた回避策を投稿すると思いました。
サーバーアプリを構成して、要求されたURLを含むカスタム応答ヘッダー(X-Response-Url
)を設定しました。私のajaxコードは、応答を受け取るたびに、xhr.getResponseHeader("x-response-url")
が定義されているかどうかを確認します。その場合、$.ajax()
を介して最初に要求したURLと比較します。文字列が異なる場合、リダイレクトがあり、さらに、実際にどの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
fetch API /を使用できるようになりました。redirected: *boolean*
を返します