Xmlhttprequest'in yeniden yönlendirilmesini önle


112

Tarayıcının XMLHttpRequest-s gönderirken yeniden yönlendirmeleri izlemesini engellemek mümkün müdür (yani yeniden yönlendirme durum kodunu geri alıp kendim işlemek için)?

Yanıtlar:


102

XMLHttpRequest nesnesi için W3C standardına göre değil (vurgu eklendi):

Yanıt bir HTTP yeniden yönlendirmesi ise:

Location başlığı tarafından iletilen URL'nin kaynağı, XMLHttpRequest kaynağı ile aynı kaynaksa ve yeniden yönlendirme sonsuz döngü önlemlerini ihlal etmiyorsa , aynı kaynak istek olay kurallarını gözlemlerken yeniden yönlendirmeyi şeffaf bir şekilde izleyin .

Onlar edildi dikkate gelecekteki bir sürümde için:

Bu belirtim, bu belirtimin gelecekteki bir sürümü için düşünülen aşağıdaki özellikleri içermez:

  • Aşağıdaki yönlendirmeleri devre dışı bırakma özelliği;

ancak en son teknik özellik artık bundan bahsetmiyor.


5
Saçma olan şey, şeffaf yeniden yönlendirmenin, orijinal istekte ayarlanan bazı HTTP başlıklarının üzerine yazmayı içermesidir. Spesifik olarak, "Kabul Et" başlığı belirli bir içerik türüne ayarlanmışsa, Firefox yeniden yönlendirmeyi izlerken bu başlığı dahil edemez (bu, bu başlığı kullanan tamamen REST tabanlı web hizmetlerini geliştirmeyi biraz daha zor hale getirir ... homurdanma).
ruquay

1
Biraz daha arama bana bu oldukça eski hata raporunu getirdi: bugzilla.mozilla.org/show_bug.cgi?id=401564
ruquay

2
Katılıyorum, tamamen redikül tasarım hatası.
Rasive

35

Yeni API Getirme destekleri yönlendirme elleçleme farklı modları: follow, error, ve manual, ama yönlendirme iptal edildiğinde yeni URL'yi veya durum kodunu görüntülemek için bir yol bulmak mümkün değil. Yeniden yönlendirmenin kendisini durdurabilirsiniz ve sonra bir hata gibi görünür (boş yanıt). İhtiyacın olan tek şey buysa, gitmekte fayda var. Ayrıca bu API üzerinden yapılan taleplerin henüz iptal edilemez olduğunu bilmelisiniz . bunlar şunlardır şimdi.

XMLHttpRequest'e gelince HEAD, sunucuyu yapabilir ve URL'nin değişip değişmediğini inceleyebilirsiniz:

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

Durum kodunu almayacaksınız, ancak yeni URL'yi tüm sayfayı ondan indirmeden bulacaksınız.


Bazen kullanmak OPTIONSdaha iyi bir seçim olabilir, yine de yalnızca genel olmayan amaçlarla çalışır, vb. Yönetici, HTTP -> HTTPS
William Leung

12

responseURLYönlendirme hedefini almak için özelliği kullanabilir veya yanıtın nihayetinde kabul ettiğiniz bir konumdan getirilip getirilmediğini kontrol edebilirsiniz.
Bu, elbette sonucun yine de getirildiği anlamına gelir, ancak en azından yönlendirme hedefi hakkında gerekli bilgileri alabilir ve örneğin yanıtı atmak istediğinizde koşulları tespit edebilirsiniz.



11

Hayır, API'de XMLHttpRequest tarafından sunulan, varsayılan davranışını otomatik olarak 301 veya 302'yi takip etmenize izin veren bir yer yok.

İstemci Windows üzerinde IE çalıştırıyorsa, bunun yerine bu davranışı önlemek için bir seçenek ayarlamak için WinHTTP kullanabilirsiniz, ancak bu çok sınırlayıcı bir çözümdür.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.