Xmlhttprequestのリダイレクトを防ぐ
-
03-07-2019 - |
質問
XMLHttpRequest-sを送信するときにブラウザがリダイレクトを追跡しないようにすることは可能ですか(つまり、リダイレクトステータスコードを取得して自分で処理するため)?
解決
XMLHttpRequestオブジェクトのW3C標準(強調を追加):
応答がHTTPリダイレクトの場合:
Locationヘッダーによって伝えられるURLのオリジンが同じオリジンである場合 XMLHttpRequestオリジンと リダイレクトは無限に違反しません ループ予防策、透過的に 観察しながらリダイレクトに従ってください 同じ起源のリクエストイベントルール。
彼らは今後のリリースで検討しました。
この仕様には含まれません されている次の機能 の将来のバージョンのために考慮 この仕様:
- 次のリダイレクトを無効にするプロパティ;
しかし、 latest 仕様では、これについて言及されなくなりました。
他のヒント
新しい Fetch API はさまざまなリダイレクト処理モードをサポートしています: follow
、 error
、および 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を見つけます。
responseURL
プロパティを使用して、リダイレクト先を取得するか、受け入れた場所から最終的に応答がフェッチされたかどうかを確認できます。
もちろん、これは結果がフェッチされることを意味しますが、少なくともリダイレクト先に関する必要な情報を取得し、たとえば、応答を破棄したいときに条件を検出することができます。
いいえ、XMLHttpRequestによって公開されるAPIには、301または302を自動的にたどるというデフォルトの動作をオーバーライドできる場所はありません。
クライアントがWindowsでIEを実行している場合、代わりにWinHTTPを使用して、その動作を防ぐオプションを設定できますが、これは非常に制限的なソリューションです。