Xmlhttprequestのリダイレクトを防ぐ


112

XMLHttpRequest-sを送信するときにブラウザがリダイレクトをたどらないようにすることはできますか(つまり、リダイレクトステータスコードを取得して自分で処理するため)。

回答:


102

XMLHttpRequestオブジェクトのW3C標準に従っていない(強調が追加されています):

応答がHTTPリダイレクトの場合:

Locationヘッダーによって伝えられたURLの起点がXMLHttpRequestの起点と同じ起点であり、リダイレクトが無限ループの予防策に違反していない場合は、同じ起点のリクエストイベントルールに従って、リダイレクト透過的に実行します。

彼らは将来のリリースのためにそれを検討していました:

この仕様には、この仕様の将来のバージョンで検討されている次の機能は含まれていません。

  • 次のリダイレクトを無効にするプロパティ。

しかし、最新の仕様ではこれについては触れられていません。


5
ばかげているのは、透過的なリダイレクトに、元のリクエストで設定された一部のHTTPヘッダーの上書きが含まれる場合です。具体的には、「Accept」ヘッダーが特定のコンテンツタイプに設定されている場合、Firefoxはリダイレクトに従うときにこのヘッダーを含めることができません(これにより、このヘッダーを使用する完全なRESTベースのWebサービスの開発が少し難しくなります...不平を言う)。
ルキー

1
さらに検索すると、このかなり古いバグレポートが表示されました:bugzilla.mozilla.org/show_bug.cgi
id

2
同意する、完全にレディクルスの設計上の欠陥。
Rasive

35

新しいAPIの取得サポートにリダイレクト処理の異なるモードを:followerror、とmanual、私はリダイレクトがキャンセルされたときに新しいURLまたはステータスコードを表示する方法を見つけることができません。リダイレクト自体を停止すると、エラー(空の応答)のように見えます。それで十分なら、行ってもかまいません。また、このAPIを介して行われたリクエストはまだキャンセルできないことにも注意してください。 彼ら今です。

XMLHttpRequestについてはHEAD、サーバーを使用して、URLが変更されたかどうかを検査できます。

var http = new XMLHttpRequest();
http.open('HEAD', '/the/url');
http.onreadystatechange = function() {
    if (this.readyState === this.DONE) {
        console.log(this.responseURL);
    }
};
http.send();

ステータスコードは取得できませんが、ページ全体をダウンロードせずに新しいURLを見つけることができます。


使用OPTIONSする方が良い選択である場合があります。いずれにせよ、汎用ではない場合にのみ機能します。管理者は
William Leung

12

responseURLプロパティを使用してリダイレクト先を取得したり、応答が最終的に受け入れた場所からフェッチされたかどうかを確認したりできます。
もちろんこれはとにかく結果がフェッチされることを意味しますが、少なくともリダイレクト先に関する必要な情報を取得できます。たとえば、応答を破棄したい場合の条件を検出できます。



11

XMLHttpRequestによって公開されたAPIには、301または302を自動的にフォローするというデフォルトの動作をオーバーライドできる場所はありません。

クライアントがWindowsでIEを実行している場合は、代わりにWinHTTPを使用して、その動作を防止するオプションを設定できますが、これは非常に制限的なソリューションです。

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