Ajaxリクエストでリダイレクトを検出しますか?


94

jQueryを使用してURLを取得し、302リダイレクトで応答したかどうかを明示的に確認したいが、リダイレクト追跡したくない

jQueryは$.ajax常にリダイレクトに従うようです。これを防ぐにはどうすればよいですか?それに従わずにリダイレクトを確認できますか?

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

回答:



41

未来へようこそ!

現在、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プロパティを使用しいくつかのタスクを解決できます。


1
この属性にさらにリソースを追加する には(XHR.responseURLのMDNページ)、MSIEで一般的なサポートが待機しているようですが、MSIEはEdge / 14でのみ追加しました。
Eli Collins

よろしくお願いします!非常に便利
ゴーティエ

このコードは実際に$ .ajax({url: 'someurl'、xhrFields:{withCredentials:true}})がInternet Explorerでエラーをスローすることを発見しました。オブジェクト。サポートしていない場合、jQueryは、withCredentialsプロパティをサポートしないXMLHttpRequestオブジェクトではなく、ActiveX IXMLHTTPRequestオブジェクトを作成します。xhr = _orgAjax.call($。ajaxSettings);を呼び出してこれを修正しました。xhr = _orgAjax();の代わりに これが誰かの役に立つことを願っています。
StephenKC

11

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

カスタム応答ヘッダーを設定するようにサーバーアプリを構成しました(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

実際、リダイレクトを行わずにリダイレクトがあるかどうかを確認する方法はありません。しかし、おそらく、期待されるヘッダーURLとリダイレクトされたヘッダーURLを比較することで、現時点での回避策になります。アイデアをありがとう
セルジオA.

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.