Dlaczego AJAX zwraca kod stanu HTTP 0?

139

Z jakiegoś powodu podczas korzystania z AJAX (z my opracowana aplikacja) przeglądarka po prostu przestaje ładować i zwraca kody statusu 0. Dlaczego to się dzieje?

tarnfeld
źródło

Odpowiedzi:

110

Inna sprawa:

Może być możliwe uzyskanie kodu stanu, 0jeśli wysłałeś wywołanie AJAX i uruchomiono odświeżanie przeglądarki przed uzyskaniem odpowiedzi AJAX . Połączenie AJAX zostanie anulowane i otrzymasz ten status.

mnk
źródło
9
Dzięki za zwrócenie uwagi na to, uświadomiłem sobie, że (podobnie jak odświeżenie przeglądarki) przesłanie formularza może anulować wywołanie Ajax.
Magnus Smith
1
Po prostu zrób<form onsubmit="return false;">
Heitor
1
Sugestia @ Heitor zadziałała dla mnie - przycisk „wyślij” mojego formularza odświeżał stronę, w międzyczasie javascript próbował uruchomić wywołanie Ajax, gdy kliknięto przycisk „Prześlij”. Rezultat był taki, że połączenie
Ajax
Hej, przegapiłeme.preventDefault();
SparK
97

Z mojego doświadczenia wynika, że ​​stan 0 będzie widoczny, gdy:

  • wykonywanie skryptów między witrynami (w przypadku odmowy dostępu)
  • żądanie adresu URL, który jest nieosiągalny (literówka, problemy z DNS itp.)
  • żądanie jest przechwytywane w inny sposób (sprawdź bloker reklam)
  • jak wyżej, jeśli żądanie zostanie przerwane (przeglądarka opuści stronę)
Langdon
źródło
1
Rozumiem, gdy odmówiono połączenia. Na przykład podczas debugowania mojej witryny w programie Visual Studio, jeśli zatrzymałem sesję debugowania, każde żądanie, które próbowało nawiązać połączenie, otrzyma net :: ERR_CONNECTION_REFUSED, a kod stanu będzie wynosił zero. Ma to sens, ponieważ nie możesz mieć kodu statusu, jeśli nie możesz połączyć się z serwerem, który powinien go dostarczać.
Triynko,
Mogę potwierdzić. Otrzymałem status == 0 po wyłączeniu mojego serwera WWW.
9ilsdx 9rvj 0lo
mam błędy z powodu „cross-site scripting”; co powinienem zrobić?
1
@nasimjahednia lookup CORS ... serwer, do którego próbujesz uzyskać dostęp, musi zezwalać na wykonywanie skryptów między witrynami z Twojej domeny.
Langdon,
Jestem zmieszany. Czy nie ma sposobu na zwrócenie kodu błędu HTTP? Tutaj jest wiele różnych przypadków (415, 404 itd.)
Edwin Evans
8

Ten sam problem podczas używania <button onclick="">submit</button>. Następnie rozwiązano za pomocą<input type="button" onclick="">

Rafi
źródło
1
Bingo !! Każdy może wyjaśnić, dlaczego to?
Jorge
3
Domyślny typ przycisku HTML to „wyślij”, więc kliknięcie go spowoduje próbę przesłania danych formularza. Więc wykona akcję kliknięcia, a następnie spróbuje przesłać. Jeśli użyjesz typu „button”, nie jest to już typ domyślny i będzie wykonywany tylko po kliknięciu.
Christophe Roussy
7

Kod stanu 0 oznacza, że ​​żądany adres URL jest nieosiągalny. Zmieniając http: // coś / coś na https: // coś / coś działało dla mnie. IE zgłasza błąd mówiąc „Odmowa uprawnień”, gdy kod stanu to 0, inne przeglądarki nie.

Jagadeesh
źródło
W takim przypadku Chrome obecnie pozostawi żądanie w stanie „zablokowane”, dopóki nie wygaśnie. Może to być spowodowane flagą Strict-Transport-Security zwróconą w poprzednim żądaniu z tego serwera lub flagą Secure / HttpOnly na pliku cookie wysyłanym z żądaniem.
Shane Hughes,
7

Należy zauważyć, że wywołania ajax mogą się nie udać nawet w ramach sesji, która jest definiowana przez plik cookie z określoną domeną poprzedzoną przedrostkiem www. Kiedy następnie wywołasz swój skrypt php, np. Bez www. prefiks w adresie URL, wywołanie zakończy się niepowodzeniem i na odwrót.

nuxxxx
źródło
4

Ten artykuł mi pomógł. Wysyłałem formularz przez AJAX i zapomniałem go użyć return false(po moim żądaniu Ajax), co doprowadziło do przesłania klasycznego formularza, ale o dziwo nie zostało ukończone.

Martin Vseticka
źródło
Świt Nienawidzę tego, że znowu mnie złapał! <form onsubmit="return false;">załatwił sprawę.
Heitor
3

Ponieważ to pokazuje się, kiedy google ajax status 0 Chciałem zostawić wskazówkę, która zajęła mi wiele godzin zmarnowanego czasu ... Używałem Ajax do wywołania usługi PHP, która była REST_Controller Phila dla Codeigniter (nie jestem pewien, czy to ma z tym coś wspólnego, czy nie) i ciągle otrzymywałem status 0, readystate 0 i doprowadzało mnie to do szału. Debugowałem go i zauważyłem, że gdy powtarzam i zwracam zamiast zamknąć komunikat, otrzymam sukces. W końcu wyłączyłem debugowanie i spróbowałem i zadziałało. Wygląda na to, że debugger xDebug w PHP w jakiś sposób modyfikował odpowiedź. Jeśli używasz debugera PHP, spróbuj go wyłączyć, aby zobaczyć, czy to pomaga.

Michael
źródło
3

Znalazłem inny przypadek, w którym jquery podaje kod statusu 0 - jeśli z jakiegoś powodu XMLHttpRequest nie jest zdefiniowany, otrzymasz ten błąd.

Oczywiście nie zdarza się to normalnie w Internecie, ale błąd w nocnej kompilacji Firefoksa spowodował, że pojawił się w dodatku, który pisałem. :)

zagłodzony
źródło
1
Wskazałeś na to, że mam problem z jQuery.ajax()obiektem XHR. Żądanie nie zostało nawet utworzone przy wywołaniu AJAX, nadal otrzymywanie f.open nie jest funkcją i kodem stanu 0. Przyczyna: $.ajaxSettings.xhr$.ajaxSetup({xhr})new window.XMLHttpRequest();
zwracałem
2

„Przypadkowe” przesłanie formularza było dokładnie tym problemem, który miałem. Właśnie całkowicie usunąłem tagi FORM i wydaje się, że rozwiązuje to problem. Dziękuję wszystkim!

Insider Pro
źródło
2

Mieliśmy podobny problem - kod statusu 0 w wywołaniu jquery ajax - i zdiagnozowanie go zajęło nam cały dzień. Ponieważ nikt jeszcze nie wspomniał o tym powodzie, pomyślałem, że się nim podzielę.

W naszym przypadku problemem była awaria serwera HTTP. Jakiś błąd w PHP zepsuł Apache, więc po stronie klienta wyglądało to tak:

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:~$ 

gdzie test.php zawierał kod powodujący awarię. Żadne dane nie zostały zwrócone z serwera (nawet nagłówki) => połączenie ajax zostało przerwane ze statusem 0.

jmper
źródło
2

W moim przypadku było to spowodowane uruchomieniem mojego serwera django, http://127.0.0.1:8000/ale wysłaniem wywołania Ajax do http://localhost:8000/. Nawet jeśli spodziewasz się, że będą mapować na ten sam adres, nie upewniają się więc, że nie wysyłasz żądań do lokalnego hosta.

Vlad Schnakovszki
źródło
2

W naszym przypadku link do strony został zmieniony z https na http . Mimo że użytkownicy byli zalogowani, uniemożliwiono im ładowanie za pomocą AJAX.

Andy w NC
źródło
ciekawy. Mam nadzieję, że to moja sprawa. Ponieważ moja ramka iframe otwiera się za pomocą https i po pomyślnym zakończeniu wysyłam Ajax do http, otrzymuję status 0
dźwiękowy
1

W moim przypadku ustawienie url: ''w ustawieniach ajax spowodowałoby kod stanu 0 w ie8 .. Wygląda na to, że po prostu nie toleruje takiego ustawienia.

blurrcat
źródło
1

Dla mnie problem był spowodowany przez firmę hostingową (GoDaddy), która traktuje operacje POST, które miały znaczące dane odpowiedzi (więcej niż dziesiątki kilobajtów), jako rodzaj zagrożenia bezpieczeństwa. Jeśli więcej niż 6 z nich wystąpiło w ciągu jednej minuty, host odmówił wykonania kodu PHP, który odpowiedział na żądanie POST w ciągu następnej minuty. Nie jestem do końca pewien, co zrobił host zamiast tego, ale widziałem, z tcpdump, pakiet resetowania TCP przychodzący jako odpowiedź na żądanie POST z przeglądarki. Spowodowało to, że kod stanu http zwrócony w obiekcie jqXHR był równy 0.

Zmiana operacji z POST na GET rozwiązała problem. Nie jest jasne, dlaczego GoDaddy nakłada ten limit, ale zmiana kodu była łatwiejsza niż zmiana hosta.

emrys57
źródło
1

Chyba wiem, co może spowodować ten błąd.

W Google Chrome jest wbudowana funkcja, która zapobiega atakom DDos na rozszerzenia Google Chrome.

Gdy żądania AJAX stale zwracają błędy statusu 500+, zaczyna ograniczać żądania.

Stąd możliwe jest otrzymanie statusu 0 przy kolejnych żądaniach.

Anonimowy
źródło
1

Próbując wygrać nagrodę z najgłupszego powodu opisanego problemu.

Zapominanie o telefonie

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

Tak, nadal otrzymywałem zerowe statusy w wywołaniu „open”.

Gordon Rouse
źródło
1

W moim przypadku otrzymywałem to, ale tylko w Safari Mobile. Problem w tym, że użyłem pełnego adresu URL ( http://example.com/cokolwiek.php ) zamiast względnego (cokolwiek.php). Nie ma to jednak sensu, nie może to być problem z XSS, ponieważ moja witryna jest hostowana pod adresem http://example.com . Wydaje mi się, że Safari sprawdza część http i automatycznie oznacza ją jako niezabezpieczone żądanie bez sprawdzania pozostałej części adresu URL.

Raúl Bojalil
źródło
1

Podczas rozwiązywania problemów stwierdziłem, że ten xmlhttpRequest.status AJAX == 0 może oznaczać, że połączenie klienta NIE dotarło jeszcze do serwera, ale nie udało się z powodu problemu po stronie klienta. Jeśli odpowiedź pochodzi z serwera, stan musi mieć postać kodu odpowiedzi HTTP 1xx / 2xx / 3xx / 4xx / 5xx. Odtąd rozwiązywanie problemów powinno koncentrować się na problemie KLIENTA i może spowodować przerwanie połączenia internetowego lub jedno z opisanych przez @ Langdon powyżej.

Panini Luncher
źródło
0

Obserwuj konsolę przeglądarki podczas wysyłania żądania, jeśli widzisz komunikat „Te same zasady pochodzenia nie pozwalają na odczytywanie zdalnego zasobu pod adresem http ajax ..... powód: brak nagłówka cors„ access-control-allow-origin ””, to musisz dodaj „Access-Control-Allow-Origin” w nagłówku odpowiedzi. exa: w java możesz ustawić to jak response.setHeader ("Access-Control-Allow-Origin", "*"), gdzie odpowiedzią jest HttpServletResponse.

Mahadev Mandale
źródło