web-dev-qa-db-ja.com

jQuery $ .ajaxでリダイレクトを検出しますか?

JQueryを使用してURLをGETし、302リダイレクトで応答したかどうかを明示的に確認したいのですが、notに従ってください。

jQueryの$.ajaxは常にリダイレクトに従うようです。どうすればこれを防ぎ、それに従わずにリダイレクトを見ることができますか?

「jquery ajax redirect」などのタイトルにはさまざまな質問がありますが、それらはすべて、サーバーが提供するステータスを直接確認するだけでなく、他の目標を達成することを伴うようです。

85
kdt

AJAXリクエストには、リダイレクトに従わない機会はありません(つまり、リダイレクトに従う必要があります)。詳細については、この回答をご覧ください https://stackoverflow.com/a/2573589/965648

78
Nick Garvey

未来へようこそ!

現在、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プロパティ。

38
Riki_tiki_tavi

この質問に答えた他の人たちは、この情報がブラウザによって隠されていることを(悲しいことに)正しいのですが、私が思いついた回避策を投稿すると思いました。

サーバーアプリを構成して、要求された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
9
Eli Collins

fetch API /を使用できるようになりました。redirected: *boolean*を返します

0
fvrab