web-dev-qa-db-ja.com

Xmlhttprequestのリダイレクトを防ぐ

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

102
Zim

XMLHttpRequestオブジェクトのW3C標準 (強調追加)に準拠していない:

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

Locationヘッダーによって伝達されるURLのOriginがXMLHttpRequest Originと同じOriginであり、リダイレクトが無限ループの予防策に違反しない場合、redirectを透過的にたどります同じ起源のリクエストイベントルールを順守します。

それらは将来のリリースのために 考慮 でした:

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

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

しかし、 latest 仕様ではこれについて言及されなくなりました。

96
Boy Baukema

新しい Fetch API は、リダイレクト処理のさまざまなモードをサポートしています:followerror、およびmanualですが、表示する方法が見つかりませんリダイレクトがキャンセルされたときの新しいURLまたはステータスコード。リダイレクト自体を停止するだけで、エラーのように見えます(空の応答)。必要なのはこれだけです。 また、このAPIを介して行われたリクエストはキャンセルできません まだ です。 それらは are now。

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を見つけます。

30
user

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

12
Roland Pihlakas

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

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

11
AnthonyWJones