Warum gibt AJAX den HTTP-Statuscode 0 zurück?

138

Aus irgendeinem Grund, während ich AJAX benutze (mit meinem entwickelte Anwendung) Der Browser stoppt nur das Hochladen und gibt Statuscodes von zurück 0. Warum passiert das?

Tarnfeld
quelle

Antworten:

109

Ein anderer Fall:

Möglicherweise können Sie einen Statuscode abrufen,0 wenn Sie einen AJAX-Anruf gesendet haben und eine Aktualisierung des Browsers ausgelöst wurde, bevor Sie die AJAX-Antwort erhalten . Der AJAX-Anruf wird abgebrochen und Sie erhalten diesen Status.

mnk
quelle
9
Vielen Dank für den Hinweis, dass ich festgestellt habe, dass (neben einer Browseraktualisierung) eine Formularübermittlung den Ajax-Anruf abbrechen kann.
Magnus Smith
1
Tun Sie es einfach<form onsubmit="return false;">
Heitor
1
@ Heitors Vorschlag funktionierte für mich - die Schaltfläche "Senden" meines Formulars aktualisierte die Seite, während ich mit Javascript versuchte, einen Ajax-Aufruf auszuführen, als auf die Schaltfläche "Senden" geklickt wurde. Ergebnis war, dass der Ajax-Anruf abgesagt wurde
Nic Scozzaro
Hey, ich habe einene.preventDefault();
SparK
97

Nach meiner Erfahrung wird der Status 0 angezeigt, wenn:

  • Cross-Site-Scripting durchführen (bei dem der Zugriff verweigert wird)
  • Anfordern einer nicht erreichbaren URL (Tippfehler, DNS-Probleme usw.)
  • Die Anfrage wird anderweitig abgefangen (überprüfen Sie Ihren Werbeblocker).
  • wie oben, wenn die Anfrage unterbrochen wird (Browser navigiert von der Seite weg)
Langdon
quelle
1
Ich bekomme es, wenn die Verbindung abgelehnt wird. Wenn ich beispielsweise beim Debuggen meiner Site mit Visual Studio die Debugging-Sitzung gestoppt habe, erhält jede Anforderung, die versucht hat, eine Verbindung herzustellen, net :: ERR_CONNECTION_REFUSED und der Statuscode ist Null. Dies ist sinnvoll, da Sie keinen Statuscode haben können, wenn Sie keine Verbindung zu dem Server herstellen können, der einen bereitstellen soll.
Triynko
Ich kann bestätigen. Ich habe den Status == 0, nachdem ich meinen Webserver heruntergefahren habe.
9ilsdx 9rvj 0lo
Ich habe Fehler wegen 'Cross-Site-Scripting'; was soll ich machen?
1
@nasimjahednia lookup CORS ... der Server, auf den Sie zugreifen möchten, muss Cross-Site-Scripting von Ihrer Domain aus ermöglichen.
Langdon
Ich bin verwirrt. Gibt es keine Möglichkeit, den HTTP-Fehlercode zurückzugeben? Dies ist eine Menge verschiedener Fälle hier (415, 404 usw.?)
Edwin Evans
8

Gleiches Problem hier bei der Verwendung <button onclick="">submit</button>. Dann gelöst mit<input type="button" onclick="">

Rafi
quelle
1
Bingo!! Kann jeder erklären warum das so ist?
Jorge
3
Standardmäßig lautet der HTML-Schaltflächentyp "Senden". Wenn Sie also darauf klicken, werden Formulardaten gesendet. Es wird also die Klickaktion ausführen und dann versuchen, sie zu senden. Wenn Sie den Typ 'button' verwenden, ist dies kein Standardtyp mehr und wird nur bei einem Klick ausgeführt.
Christophe Roussy
7

Der Statuscode 0 bedeutet, dass die angeforderte URL nicht erreichbar ist. Durch Ändern von http: // etwas / etwas in https: // etwas / etwas hat es für mich funktioniert. IE gibt einen Fehler aus, der besagt, dass "Berechtigung verweigert" ist, wenn der Statuscode 0 ist, andere Browser nicht.

Jagadeesh
quelle
In diesem Fall belässt Chrome die Anforderung derzeit im Status "Blockiert", bis eine Zeitüberschreitung auftritt. Dies kann entweder durch ein Strict-Transport-Security- Flag verursacht werden, das in einer vorherigen Anforderung von diesem Server zurückgegeben wurde, oder durch ein Secure / HttpOnly- Flag für ein Cookie, das mit der Anforderung gesendet wird.
Shane Hughes
7

Es ist wichtig zu beachten, dass Ajax-Aufrufe auch innerhalb einer Sitzung fehlschlagen können, die durch ein Cookie mit einer bestimmten Domain definiert wird, der www vorangestellt ist. Wenn Sie dann Ihr PHP-Skript aufrufen, zB ohne das www. Präfix in der URL, der Anruf schlägt fehl und umgekehrt auch.

nuxxxx
quelle
4

Dieser Artikel hat mir geholfen. Ich habe das Formular über AJAX gesendet und vergessen return false(nach meiner Ajax-Anfrage), es zu verwenden, was zur klassischen Formularübermittlung führte, aber seltsamerweise wurde es nicht ausgefüllt.

Martin Vseticka
quelle
Dawn Ich hasse die Tatsache, dass ich wieder von diesem erwischt wurde! <form onsubmit="return false;">hat den Trick gemacht.
Heitor
3

Da dies angezeigt wird, wenn Sie den Ajax-Status 0 googeln, wollte ich einen Tipp hinterlassen, der mir nur Stunden verschwendeter Zeit gekostet hat ... Ich habe Ajax verwendet, um einen PHP-Dienst aufzurufen, der zufällig Phils REST_Controller für Codeigniter ist (nicht sicher, ob dies der Fall ist) irgendetwas damit zu tun oder nicht) und bekam immer wieder Status 0, Readystate 0 und es machte mich verrückt. Ich habe es debuggt und festgestellt, wann ich ein Echo erhalte und zurückkehre, anstatt die Nachricht zu beenden, dass ich Erfolg haben würde. Schließlich schaltete ich das Debuggen aus und versuchte es und es funktionierte. Der xDebug-Debugger mit PHP hat die Antwort anscheinend irgendwie geändert. Wenn Sie einen PHP-Debugger verwenden, schalten Sie ihn aus, um festzustellen, ob dies hilfreich ist.

Michael
quelle
3

Ich habe einen anderen Fall gefunden, in dem jquery Ihnen den Statuscode 0 gibt. Wenn XMLHttpRequest aus irgendeinem Grund nicht definiert ist, wird dieser Fehler angezeigt.

Natürlich passiert dies normalerweise nicht im Web, aber ein Fehler in einem nächtlichen Firefox-Build führte dazu, dass dies in einem Add-On auftauchte, das ich schrieb. :) :)

starrte
quelle
1
Sie haben darauf jQuery.ajax()hingewiesen , ich hatte ein Problem mit dem XHR-Objekt. Die Anfrage wurde nicht einmal beim AJAX-Aufruf erstellt. Das Abrufen von f.open ist keine Funktion und kein Statuscode 0. Verursacht durch: Ich habe ein $.ajaxSettings.xhrObjekt von $.ajaxSetup({xhr})zurückgegeben und new window.XMLHttpRequest();stattdessen das Problem gelöst
klimpond
2

Das "versehentliche" Absenden des Formulars war genau das Problem, das ich hatte. Ich habe gerade die FORM-Tags komplett entfernt und das scheint das Problem zu beheben. Dank euch allen!

Insider Pro
quelle
2

Wir hatten ein ähnliches Problem - Statuscode 0 beim Aufruf von jquery ajax - und wir haben den ganzen Tag gebraucht, um es zu diagnostizieren. Da noch niemand diesen Grund erwähnt hatte, dachte ich, ich werde teilen.

In unserem Fall war das Problem ein Absturz des HTTP-Servers. Ein Fehler in PHP hat Apache in die Luft gejagt, so dass es auf Client-Seite so aussah:

mirek@toccata:~$ telnet our.server.com 80
Trying 180.153.xxx.xxx...
Connected to our.server.com.
Escape character is '^]'.
GET /test.php HTTP/1.0
Host: our.server.com

Connection closed by foreign host.
mirek@toccata:~$ 

Dabei enthielt test.php den Absturzcode. Keine vom Server zurückgegebenen Daten (nicht einmal Header) => Ajax-Aufruf wurde mit dem Status 0 abgebrochen.

jmper
quelle
2

In meinem Fall wurde dies dadurch verursacht, dass mein Django-Server unter ausgeführt wurde, http://127.0.0.1:8000/aber der Ajax-Aufruf an gesendet wurde http://localhost:8000/. Obwohl Sie erwarten würden, dass sie derselben Adresse zugeordnet werden, stellen sie nicht sicher, dass Sie Ihre Anfragen nicht an localhost senden.

Vlad Schnakovszki
quelle
2

In unserem Fall wurde der Seitenlink von https in http geändert . Obwohl die Benutzer angemeldet waren, konnten sie nicht mit AJAX geladen werden.

Andy In NC
quelle
interessant. Ich hoffe es ist mein Fall. Da mein Iframe mit https geöffnet wird und ich bei Erfolg einen Ajax an den http sende, erhalte ich den Status 0
Sonic
1

In meinem Fall würde die Einstellung url: ''in Ajax-Einstellungen zu einem Statuscode 0 in ie8 führen. Es scheint, dass eine solche Einstellung einfach nicht toleriert wird.

Unschärfekatze
quelle
1

Für mich wurde das Problem dadurch verursacht, dass das Hosting-Unternehmen (Godaddy) POST-Vorgänge mit erheblichen Antwortdaten (mehr als zehn Kilobyte) als eine Art Sicherheitsbedrohung behandelte. Wenn mehr als 6 davon in einer Minute auftraten, weigerte sich der Host, den PHP-Code auszuführen, der in der nächsten Minute auf die POST-Anfrage antwortete. Ich bin nicht ganz sicher, was der Host stattdessen getan hat, aber ich habe mit tcpdump ein TCP-Reset-Paket als Antwort auf eine POST-Anfrage vom Browser gesehen. Dies führte dazu, dass der in einem jqXHR-Objekt zurückgegebene http-Statuscode 0 war.

Das Ändern der Operationen von POST zu GET hat das Problem behoben. Es ist nicht klar, warum Godaddy diese Grenze auferlegt, aber das Ändern des Codes war einfacher als das Ändern des Hosts.

emrys57
quelle
1

Ich glaube zu wissen, was diesen Fehler verursachen kann.

In Google Chrome gibt es eine integrierte Funktion, um DDOS-Angriffe für Google Chrome-Erweiterungen zu verhindern.

Wenn Ajax-Anforderungen kontinuierlich mehr als 500 Statusfehler zurückgeben, werden die Anforderungen gedrosselt.

Daher ist es möglich, bei folgenden Anforderungen den Status 0 zu erhalten.

Anonym
quelle
1

In einem Versuch, den Preis aus dem dümmsten Grund für das beschriebene Problem zu gewinnen.

Vergessen zu rufen

xmlhttp.send(); //yes, you need this pivotal line!

Ja, ich habe beim Status "Offen" immer noch eine Statusrückgabe von Null erhalten.

Gordon Rouse
quelle
1

In meinem Fall bekam ich das aber nur auf Safari Mobile. Das Problem ist, dass ich die vollständige URL ( http://example.com/whatever.php ) anstelle der relativen URL (Whatever.php) verwendet habe. Dies macht jedoch keinen Sinn, es kann kein XSS-Problem sein, da meine Website unter http://example.com gehostet wird . Ich denke, Safari betrachtet den http-Teil und kennzeichnet ihn automatisch als unsichere Anforderung, ohne den Rest der URL zu überprüfen.

Raúl Bojalil
quelle
1

Bei meiner Fehlerbehebung stellte ich fest, dass AJAX xmlhttpRequest.status == 0 bedeuten könnte, dass der Clientaufruf den Server noch NICHT erreicht hat, aber aufgrund eines Problems auf der Clientseite fehlgeschlagen ist. Wenn die Antwort vom Server stammt, muss der Status entweder der HTTP-Antwortcode 1xx / 2xx / 3xx / 4xx / 5xx sein. Von nun an konzentriert sich die Fehlerbehebung auf das CLIENT-Problem und kann eine unterbrochene Internet-Netzwerkverbindung oder eine der oben von @Langdon beschriebenen sein.

Panini Luncher
quelle
0

Beobachten Sie die Browser-Konsole, während Sie die Anfrage stellen. Wenn Sie sehen, dass "Die gleiche Ursprungsrichtlinie das Lesen der Remote-Ressource unter http ajax nicht zulässt ..... Grund: Der Cors-Header 'Zugriffskontrolle-Zulassen-Ursprung' fehlt", müssen Sie dies tun Fügen Sie "Access-Control-Allow-Origin" in den Antwortheader ein. Beispiel: In Java können Sie dies wie response.setHeader ("Access-Control-Allow-Origin", "*") festlegen, wobei die Antwort HttpServletResponse ist.

Mahadev Mandale
quelle