Bir HTTP isteğinin durum kodu 0 döndürmesi ne anlama gelir?


130

Getirme veya XMLHttpRequest gibi JavaScript ağ çağrılarının veya başka herhangi bir HTTP ağ isteği türünün 0 HTTP durum koduyla başarısız olması ne anlama gelir?

Diğer kodlar HTTP belirtiminde üç basamaklı olduğundan, bu geçerli bir HTTP durum kodu gibi görünmüyor.

Bir test olarak ağın bağlantısını tamamen kesmeyi denedim. İlişkisiz olabilir, ancak bu durum kodu 17003 (IIRC) ile sonuçlandı, bu da üstünkörü aramanın "DNS sunucusu araması başarısız" anlamına geldiğini gösteriyor.

Aynı kod, bazı konumlarda ve sistemlerde iyi çalışır, ancak belirli ortamlarda 0 durum kodu ile başarısız olur ve herhangi bir responseText sağlanmaz.

Bu, bir İnternet URL'sine gönderilen tipik bir HTTP POST'udur. Firefox'ta başarılı olduğunu gösteren 0 döndürdüğünü anladığım file: // içermiyor.


Güvenlik duvarı nedeniyle olabilir mi? İstemciniz uygulamayı hangi işletim sisteminde çalıştırıyor?
shahkalpesh



Firefox'ta da aynı sorunu yaşadım ve bir reklam engelleyici eklentisinin şu kelimeyi içeren URL'lere yönelik tüm istekleri engellediğini öğrendimbanner
19

Yanıtlar:


56

Hata kodunun yanıtın boş olduğunu gösterdiğine inanıyorum (üstbilgiler bile döndürülmediğinden). Bu, bağlantının kabul edildiği ve ardından sorunsuz bir şekilde kapatıldığı anlamına gelir (TCP FIN). Buna neden olabilecek birkaç şey var, ancak açıklamanıza göre, bir tür güvenlik duvarı en olası suçlu gibi görünüyor.


2
Sanırım muhtemelen haklısın. (Her ne kadar @sleepycod tarafından belirtildiği gibi wininet.dll'nin gerçek bir http durum kodu olmadığında bazı durum kodunu döndürmesi beklenirdi .)
mike nelson 21

1
Bu mutlaka doğru değildir. Ben de aynı sorunu yaşadım, ancak benim durumumda asla bir istek gönderilmedi. Bunun nedeni, bir Firefox reklam engelleyicisinin, URL'lerinde şu kelimeyi içeren istekleri engellemesiydibanner
19

194

Buradaki cevapların çoğu yanlış. Görünüşe göre insanlar durumlarına neyin sebep olduğunu anlıyorlar == 0 ve sonra bunu cevap olarak genelleştiriyorlar.

Pratik olarak konuşursak, başarısız bir XmlHttpRequest için status == 0 tanımlanmamış bir hata olarak değerlendirilmelidir.

Gerçek W3C spesifikasyonu, burada sıfırın döndürüldüğü koşulları tanımlar: https://fetch.spec.whatwg.org/#concept-network-error

Spesifikasyondan da görebileceğiniz gibi (fetch veya XmlHttpRequest) bu kod, sunucuyla bağlantı kurulmadan önce meydana gelen bir hatanın sonucu olabilir.

Bu durum kodunu üreten yaygın durumlardan bazıları diğer yanıtlarda yansıtılmıştır, ancak bu sorunlardan herhangi biri olabilir veya hiçbiri olmayabilir:

  1. Yasadışı çapraz kaynak talebi (bkz. CORS )
  2. Güvenlik duvarı engelleme veya filtreleme
  3. İsteğin kendisi kodla iptal edildi
  4. Yüklü bir tarayıcı uzantısı işleri karıştırıyor

Tarayıcıların bu durum == 0 senaryolarından daha fazlası için ayrıntılı hata raporu sağlaması yararlı olabilir. Aslında, bazen status == 0 yardımcı bir konsol mesajına eşlik eder, ancak diğerlerinde başka bilgi yoktur.


4
Firefox addon NoScript, güvenilmeyen ana bilgisayarlara XHR isteğini iptal edebilir.
Ivan Solntsev

5
+ 1, bunların hepsi doğrudur ve "bir tür hata oluştu" pratik yorumlamadır. Spesifikasyon tarafından verilen kapsamlı bir olası nedenler listesiyle ilgilenen kişiler için, stackoverflow.com/a/26451773/1709587 adresinde bir döküm yayınladım .
Mark Amery

1
Mark Amery'nin detaylandırdığı davalar arasında beni en çok rahatsız eden davalar cors davası. Hata, yanıtın bu arada cors doğrulamasında başarısız olmasına neden olursa, http durumu yerine 0 durumu alırsınız, çünkü cors doğrulaması başarısız olduğunda yanıta erişilemez. Özellikle bakıma giren ve 503'e yanıt veren bir web api'sini tespit etmeye çalışırken sinir bozucu. Bu api, bakım altındayken cors'u kabul etmezse, 503'ü tespit edemezsiniz, sadece 0 elde edersiniz, bu da pek çok başka şeyden kaynaklanabilir. bir şeyler.
Frédéric

Karşılaştığım CORS sorunu: Sayfanız başlangıçta yüklendiyse httpbunun yerine kullanmayı düşünün ve bunun tersi de geçerlidir. Başka sözler ajax yapmazlar yoluyla sayfanızın üzerinden erişilebilir olsaydı ve ajax yapmazlar yoluyla Sayfanız initiallly üzerinden erişilebilir olsaydı . httpshttpPOSThttpshttpPOSThttphttps
Victor Ponamarev

Eşzamanlı istekler, 0 durumuna daha anlamlı bir istisna
atıyor

35

Değeri ne olursa olsun, tarayıcıya bağlı olarak, jQuery tabanlı AJAX çağrıları, başarı geri aramanızı 0 HTTP durum kodu ile çağırır. "0" durum kodu bulduk, genellikle kullanıcının daha önce farklı bir sayfaya gittiği anlamına gelir AJAX çağrısı tamamlandı.

Kullandığınızla aynı teknoloji yığını değil, ama umarım birisi için yararlıdır.


Evet, bu sayfa 10.000 kez görüntülendiğinden insanlar muhtemelen bu sorunu çok yaşıyor.
mike nelson

Yoksa 25.000 görüntüleme mi demeliyim?
mike nelson

3
Çok değerlidir: Otomatik testlerimde tam olarak yanlış ateşleyen şey buydu. Çok teşekkürler!
alexfernandez

Bu doğru yanıt olduğu için değil, benim durumumda olan şey bu olduğu için oy verildi.
Juan Mendes

Bu kesinlikle gerçekleşir, ancak hata kodunu == 0 görmenizin tek nedeni bu değildir. Bunun yalnızca kullanıcının uzaklaştığını varsayamaz ve bu türden hata mesajlarını filtreleyemezsiniz.
vel

14

wininet.dll aşağıda listelenen hem standart hem de standart olmayan durum kodlarını döndürür.

401 - Unauthorized file
403 - Forbidden file
404 - File Not Found
500 - some inclusion or functions may missed
200 - Completed

12002 - Server timeout
12029,12030, 12031 - dropped connections (either web server or DB server)
12152 - Connection closed by server.
13030 - StatusText properties are unavailable, and a query attempt throws an exception

"Sıfır" durum kodu için, bir web sunucusu üzerinde veya bir web sunucusu olmadan çalışan yerel bir web sayfasında bir istek mi yapmaya çalışıyorsunuz?

XMLHttpRequest status = 0 ve XMLHttpRequest statusText = unknown , komut dosyanızı bir web sunucusunda çalıştırmıyorsanız size yardımcı olabilir.


Kodlar için teşekkürler. Hayır, yerel bir istek değil, yerel olarak çalışan bir vbscript'ten internet üzerindeki bir web sunucusuna yapılan bir istektir.
mike nelson

6

Çözüm: Ne yapmaya karar verdik

Güvenlik duvarı sorunlarıyla ilgili olduğunu düşündük ve bu yüzden hile yapan bir geçici çözüm bulduk. Aynı sorunu yaşayan biri varsa, işte yaptığımız şey:

  1. Daha önce yaptığımız gibi verileri bir HTA kullanarak yerel sabit diskteki bir metin dosyasına yazıyoruz.

  2. Kullanıcı "verileri sunucuya geri gönder" i tıkladığında, HTA verileri okur ve bu verileri bir XML veri adası olarak içeren bir HTML sayfası yazar (aslında bir SCRIPT LANGUAGE = XML komut bloğu kullanarak).

  3. HTA, tarayıcıda HTML sayfasına bir bağlantı başlatır.

  4. HTML sayfası artık verileri sunucuya gönderen javascript'i içermektedir (Microsoft.XMLHTTP kullanarak).

Umarım bu, benzer bir gereksinimi olan herkese yardımcı olur. Bu durumda, ticari fuarlarda dizüstü bilgisayarda kullanılan bir Flash oyunuydu. Hiçbir zaman dizüstü bilgisayara erişemedik ve bu ticari fuar başka bir ülkede gerçekleştiği için yalnızca müşteriye e-posta gönderebildik.


Merhaba Üretimdeki bir müşterinin başına gelen benzer bir sorunu araştırıyorum. Sorunun sizin için bir güvenlik duvarından kaynaklandığını söylüyorsunuz. Güvenlik duvarının neden olduğu etkiyi veya güvenlik duvarının buna neden olmak için ne yaptığını hatırlıyor musunuz?
Ibrahim Najjar

5

0 HTTP yanıt kodu, AJAX isteğinin iptal edildiğini gösterir.

Bu, bir zaman aşımı, XHR kürtajı veya istek üzerine çalışan bir güvenlik duvarı ile olabilir. Zaman aşımı yaygındır, bu, isteğin belirli bir süre içinde yerine getirilemediği anlamına gelir. Bir XHR Kürtajı yapmak çok basittir ... AJAX çağrısını iptal etmek için bir XMLHttpRequest nesnesinde .abort () öğesini çağırabilirsiniz. ( Bu, AJAX çağrılarının geri dönmesini ve yok edilen nesnelere başvurmaya çalışılmasını istemiyorsanız, tek sayfalı bir uygulama için iyi bir uygulamadır. ) İşaretli yanıtta belirtildiği gibi, bir güvenlik duvarı da isteği iptal edebilir ve bunu tetikleyebilir. 0 yanıt.

XHR İptali: Ajax isteklerini jQuery kullanarak iptal edin

var xhr = $.ajax({
    type: "POST",
    url: "some.php",
    data: "name=John&location=Boston",
    success: function(msg){
       alert( "Data Saved: " + msg );
    }
});

//kill the request
xhr.abort()

Bir XHR nesnesinde .abort () yöntemini çalıştırmanın, hata geri aramasını da tetikleyeceğini belirtmek gerekir. Bu nesneleri ayrıştıran herhangi bir hata işleme yapıyorsanız, durdurulmuş bir XHR ile bir XHR zaman aşımının aynı olduğunu hemen fark edeceksiniz, ancak jQuery ile hata geri aramasına aktarılan textStatus, iptal edildiğinde "iptal" olacaktır. ve bir zaman aşımı ile "zaman aşımı" meydana gelir. Zepto kullanıyorsanız (jQuery'ye çok benzer) errorType iptal edildiğinde "error" ve bir zaman aşımı olduğunda "timeout" olacaktır.

jQuery: error(jqXHR, textStatus, errorThrown);
Zepto:  error(xhr, errorType, error);

4

Bu sayfada bu cevapta ayrıntılı olarak açıklandığı gibi , 0 durum kodu, isteğin herhangi bir nedenle başarısız olduğu anlamına gelir ve bir javascript kitaplığı, hatayı 0 durum kodu olarak yorumladı.

Bunu test etmek için aşağıdakilerden birini yapabilirsiniz:

1) URL'nizi URL'nizin sürümünden şuraya yeniden yönlendirmek için bu krom uzantısını kullanın https.http , çünkü bu karışık bir içerik güvenlik hatasına neden olur ve sonuçta 0 durum kodu oluşturur. Bu yaklaşımın avantajı, Uygulamanızı değiştirmek zorunda değilsiniz ve bu uzantıyı kullanarak url'nizi kolayca "yeniden yazabilirsiniz".

2) İsteğe bağlı olarak, uç noktanızın httpsürüm yerine URL'nizin httpssürümüne (veya tam tersi) yönlendirmesini sağlamak için uygulamanızın kodunu değiştirin . Bunu yaparsanız, istek 0 durum koduyla başarısız olur.


1
"Bu Chrome uzantısını kullan" - Bir Chrome uzantısı mı? Bir HTA başvurusunda mı?
Quentin

4
Kesinlikle iyi bir nokta! Ancak buraya gelen çoğu insan HTA başvuruları için buraya gelmiyor. Google'da "javascript http durum kodu 0" veya buna benzer bir şey yapıyorlar ve buraya geliyorlar - bu nedenle, bu sorunun HTA kısmının genel olarak en az önemli olduğunu düşünüyorum ve sonuçta bu hala geçerli.
Brad Parks

2

Benim durumumda, WWW'yi alanımın önüne koymayı unuttuğumda durum 0 oldu. Tüm ajax isteklerim http: /WWW.mydomain.com olarak kodlanmış olduğundan ve yüklenen web sayfası sadece http://mydomain.com olduğundan, farklı bir etki alanı olduğu için bir güvenlik sorunu haline geldi. Her zaman www önüne koymak için .htaccess dosyamda bir yönlendirme yaptım.


1

Benim durumumda, bunun nedeni AJAX çağrısının aynı menşe politikası nedeniyle tarayıcı tarafından engellenmesiydi . Bu en az beklenen şeydi, çünkü tüm HTML'lerim ve komut dosyalarımın sunulduğu yer 127.0.0.1. Nasıl farklı kökenlere sahip oldukları düşünülebilir?

Her neyse, asıl neden masum görünen bir <base>etiketti:

<base href='<%=request.getScheme()%>://<%=request.getServerName() + ":" + request.getServerPort() + request.getContextPath()%>/'/>

Bu <base>arada ihtiyacım olmayan etiketi kaldırdım ve şimdi iyi çalışıyor!


1

Durum == 0 için yeni ve belgelenmemiş bir neden buldum. İşte sahip olduğum şey:

XMLHttpRequest.status === 0
XMLHttpRequest.readyState === 0
XMLHttpRequest.responseText === ''
XMLHttpRequest.state() === 'rejected'

Kaynaklar arası, ağ veya iptal edilen isteklerden kaynaklanmadı (kod veya kullanıcı navigasyonu ile). Geliştirici konsolunda veya ağ günlüğünde hiçbir şey yok.

State () ile ilgili çok az belge bulabildim (Mozilla bunu listelemiyor, W3C listelemiyor) ve hiçbirinde "reddedildi" den bahsetmiyor.

Görünüşe göre reklam engelleyicim (Firefox'ta uBlock Origin).


1

Lee'nin cevabına ek olarak , eşzamanlı isteklere geçerek gerçek neden hakkında daha fazla bilgi bulabilirsiniz , çünkü ayrıca bir istisna elde edeceksiniz:

function request(url) {
    var request = new XMLHttpRequest();
    try {
        request.open('GET', url, false);
        request.send(null);
    } catch (e) {
        console.log(url + ': ' + e);
    }
}

Örneğin :

NetworkError: Bir ağ hatası oluştu.


0

Başka birinin bu sorunla karşılaşması durumunda, bu AJAX isteği ve gönderilen normal bir form isteği nedeniyle bana sorun veriyordu. Bunu şu satırla çözdüm:

<form onsubmit="submitfunc(); return false;">

Buradaki anahtar, formun gönderilmemesine neden olan yanlış dönüştür. Ayrıca submitfunc () 'un içinden de false döndürebilirsiniz, ancak ben bunu açıkça yazmayı daha açık buluyorum.


1
Varsayılanı Önleme bunun için de çalışır. Bu, tarayıcının olaylar sırasında varsayılan davranışı yürütmesini önleyen, yerel işlevselliği düzgün bir şekilde geçersiz kılmanıza / engellemenize olanak tanıyan bir javascript işlevidir ... yanlış döndürmek de aynı şeyi yapar.
Cory Danielson

0

client_max_body_sizeNginx direktifini aşan bir ajax dosyası yüklemesinin bu hata kodunu döndüreceğine dikkat edilmelidir .


0

Yerel PC'de test yapıyorsanız, çalışmayacaktır. Ajax örneğini test etmek için HTML dosyalarını bir web sunucusuna yerleştirmeniz gerekir.


0

Benim durumumda, hata, içinde bir HTTPS isteği yapmaya çalışan bir Javascript ile HTTP protokolü ile istenen bir sayfada meydana geldi. Ve tam tersi.

Sayfa yüklendikten sonra, F12'ye (veya Ctrl + U) basın ve sayfanızın HTML koduna bir göz atın. Kodunuzda buna benzer bir şey görürseniz:

<!-- javascript request inside the page -->
<script>
var ajaxurl = "https://example.com/wp-admin/admin-ajax.php";
(...)
</script>

Ve sayfanız şu şekilde talep edildi:

http://example.com/example-page/2019/09/13/my-post/#elf_l1_Lw

Kesinlikle bu hatayla karşılaşacaksınız.

Düzeltmek için, Javascript isteğinin protokolünü sayfa isteği protokolüne eşit olarak ayarlayın.

Sayfa ve js istekleri için farklı protokolleri içeren bu durum daha önce Brad Parks'ın cevabında belirtilmişti ancak sanırım burada sunulan teşhis tekniği kullanıcıların çoğu için daha kolay.

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.