Cegah pengalihan Xmlhttprequest

112

Apakah mungkin untuk mencegah browser mengikuti pengalihan saat mengirim XMLHttpRequest-s (yaitu untuk mendapatkan kembali kode status pengalihan dan menanganinya sendiri)?

Zim
sumber

Jawaban:

102

Tidak sesuai dengan standar W3C untuk objek XMLHttpRequest (penekanan ditambahkan):

Jika responsnya adalah pengalihan HTTP:

Jika asal URL yang disampaikan oleh header Lokasi adalah asal yang sama dengan asal XMLHttpRequest dan pengalihan tidak melanggar tindakan pencegahan loop tak terbatas, ikuti pengalihan secara transparan sambil mengamati aturan peristiwa permintaan asal yang sama.

Mereka sedang mempertimbangkannya untuk rilis di masa mendatang:

Spesifikasi ini tidak menyertakan fitur berikut yang sedang dipertimbangkan untuk versi mendatang dari spesifikasi ini:

  • Properti untuk menonaktifkan pengalihan berikut;

tetapi spesifikasi terbaru tidak lagi menyebutkan hal ini.

Boy Baukema
sumber
5
Yang konyol adalah ketika pengalihan transparan melibatkan penimpaan beberapa header HTTP yang disetel dalam permintaan asli. Secara khusus, jika tajuk "Terima" disetel ke jenis konten tertentu, Firefox gagal menyertakan tajuk ini saat mengikuti pengalihan (yang membuatnya sedikit lebih sulit untuk mengembangkan layanan web berbasis REST sepenuhnya yang menggunakan tajuk ini ... ngomel).
ruquay
1
Beberapa pencarian lagi memberi saya laporan bug yang agak lama ini: bugzilla.mozilla.org/show_bug.cgi?id=401564
ruquay
2
Setuju, cacat desain rediculus total.
Rasive
35

Baru Fetch API mendukung modus yang berbeda dari penanganan redirect: follow, error, dan manual, tapi aku tidak bisa menemukan cara untuk melihat URL baru atau kode status saat pengalihan telah dibatalkan. Anda hanya dapat menghentikan pengalihan itu sendiri, dan kemudian terlihat seperti kesalahan (respons kosong). Jika hanya itu yang Anda butuhkan, Anda siap melakukannya. Juga Anda harus menyadari bahwa permintaan yang dibuat melalui API ini tidak dibatalkan belum . Mereka yang sekarang.

Adapun XMLHttpRequest, Anda dapat HEADserver dan memeriksa apakah URL telah berubah:

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

Anda tidak akan mendapatkan kode status, tetapi akan menemukan URL baru tanpa mengunduh seluruh halaman darinya.

pengguna
sumber
Terkadang menggunakan OPTIONSmungkin merupakan pilihan yang lebih baik, namun hanya berfungsi untuk tujuan non-umum, dll. Administrator telah mengonfigurasi pengalihan seluruh situs / skema, seperti HTTP -> HTTPS
William Leung
12

Anda dapat menggunakan responseURLproperti untuk mendapatkan tujuan pengalihan atau memeriksa apakah respons pada akhirnya diambil dari lokasi yang Anda terima.
Ini tentu saja berarti bahwa hasilnya tetap diambil, tetapi setidaknya Anda bisa mendapatkan info yang diperlukan tentang tujuan pengalihan dan misalnya mendeteksi kondisi saat Anda ingin membuang respons.

Roland Pihlakas
sumber
Tidak berfungsi di pengembang
IE.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/…
11

Tidak, Anda tidak ada tempat di API yang diekspos oleh XMLHttpRequest yang memungkinkan Anda menimpa perilaku defaultnya dengan mengikuti 301 atau 302 secara otomatis.

Jika klien menjalankan IE di windows maka Anda dapat menggunakan WinHTTP sebagai gantinya untuk mengatur opsi untuk mencegah perilaku itu tetapi itu adalah solusi yang sangat membatasi.

AnthonyWJones
sumber