web-dev-qa-db-ja.com

javascriptXMLHttpRequestのリダイレクト場所をキャプチャします

XMLHttpRequestを使用している場合、ブラウザが透過的にリダイレクトを追跡するため、リダイレクトをインターセプトしたり防止したりすることはできませんが、どちらかを実行することは可能です。

A.リクエストがリダイレクトされたかどうかを判断します。

B.決定whereリダイレクト先? (応答がヒントを与えないと仮定して)

コード例:

$.post("/my-url-that-redirects/", {}, 
    function(response, statusCode, xmlHttpRequest){
        //Somehow grab the location it redirected to
    }
);

私の場合、firebugは最初にPOSTをURLに表示し、次にリダイレクトされたURLにGETを表示します。そのGETの場所をキャプチャできますか?

17
Snea

1)301(2 **)とは異なるステータスコードを使用し(ajaxからのリクエストの場合)、クライアント側でリダイレクトを処理します。

var STATUS = {
  REDIRECT: 280
};

$.post('/redirected', {}, function(response, status, request) {
  if (status == STATUS.REDIRECT) {
    // you need to return the redirect url
    location.href = response.redirectUrl;
  } else {
    $('#content').html(request.responseText);
  }
});

2)リダイレクトしないでください:

私はそれを「リダイレクトパターン」=投稿リクエスト後のリダイレクトで使用します(ユーザーが投稿リクエストを更新できるようにしたくないなど)。

Ajaxリクエストでは、これは必要ないので、postリクエストがajaxの場合、代わりに転送します(サーバー側のフレームワーク、または使用しているものに応じて、別のコントローラーに転送するだけです...)。 POSTリクエストはブラウザによってキャッシュされません。

実際、それが必要な理由がわからないので、これはあまり役に立たないかもしれません。これは、サーバーがajaxリクエストに対して一般的なリクエストとは異なる応答を返す場合に役立ちます。これは、ブラウザーがajaxリクエストをリダイレクトする場合、リダイレクトされるリクエストはXMLHttpRequestではないためです。

[更新]

次のように(リダイレクトされたリクエストの)ヘッダーにアクセスできます。

$.post('redirected', {}, function(r, s, req) {
  req.getAllResponseHeaders();
  req.getResponseHeader('Location');
});

'Location'ヘッダーがあるはずですが、どのヘッダーが返送されるかはサーバーによって異なります。

3
Vojta

4年後、Chrome 42+(Opera 29+)およびFirefox 39+でXHRインスタンスからresponseURLを使用して最後のリダイレクト場所を見つけることができますが、IE、Edge、またはSafariではまだ利用できません。

2
Ali