Perché AJAX restituisce il codice di stato HTTP 0?


139

Per qualche motivo, durante l'utilizzo di AJAX (con my applicazione sviluppata) il browser interrompe il caricamento e restituisce i codici di stato di 0. Perché succede?

Risposte:


110

Un altro caso:

Potrebbe essere possibile ottenere un codice di stato 0se è stata inviata una chiamata AJAX ed è stato attivato un aggiornamento del browser prima di ottenere la risposta AJAX . La chiamata AJAX verrà annullata e verrà visualizzato questo stato.


9
Grazie per averlo sottolineato, mi ha portato a capire che (oltre all'aggiornamento del browser) un modulo inviato può annullare la chiamata ajax.
Magnus Smith,

1
Basta fare<form onsubmit="return false;">
Heitor il

1
Il suggerimento di @ Heitor ha funzionato per me: il pulsante "Invia" del mio modulo stava aggiornando la pagina, nel frattempo avevo javascript che cercava di eseguire una chiamata Ajax quando si faceva clic sul pulsante "Invia". Il risultato fu che la chiamata ajax fu cancellata
Nic Scozzaro il

Ehi, mi sono perso une.preventDefault();
SparK l'

97

Nella mia esperienza, vedrai uno stato di 0 quando:

  • esecuzione di script tra siti (in cui l'accesso è negato)
  • richiesta di un URL non raggiungibile (errore di battitura, problemi DNS, ecc.)
  • la richiesta viene altrimenti intercettata (controlla il blocco degli annunci)
  • come sopra, se la richiesta viene interrotta (il browser si allontana dalla pagina)

1
Lo ricevo quando la connessione viene rifiutata. Ad esempio, quando eseguo il debug del mio sito con Visual Studio, se ho interrotto la sessione di debug, qualsiasi richiesta che ha tentato di connettersi diventerà net :: ERR_CONNECTION_REFUSED e il codice di stato sarà zero. Questo ha senso, dal momento che non puoi avere un codice di stato se non riesci a connetterti al server che dovrebbe fornirne uno.
Triynko,

Posso confermare. Ho lo stato == 0 dopo aver spento il mio web server.
9ilsdx 9rvj 0lo,

ho errori dovuti a "scripting cross-site"; cosa dovrei fare?

1
@nasimjahednia lookup CORS ... il server a cui stai tentando di accedere deve consentire lo scripting cross site dal tuo dominio.
Langdon,

Non ho capito bene. Non è possibile ottenere il codice di errore HTTP restituito? Qui ci sono molti casi diversi (415, 404, ecc.)
Edwin Evans,

8

Lo stesso problema qui durante l'utilizzo <button onclick="">submit</button>. Quindi risolto utilizzando<input type="button" onclick="">


1
Bingo !! Qualcuno può spiegare perché questo?
Jorge

3
Per impostazione predefinita, il tipo di pulsante HTML è "Invia", quindi facendo clic su di esso tenterà di inviare i dati del modulo. Quindi eseguirà l'azione clic, quindi tenterà di inviare. Se usi il tipo 'pulsante' non è più il tipo predefinito e eseguirà solo il clic.
Christophe Roussy,

7

Il codice di stato 0 indica che l'URL richiesto non è raggiungibile. Modificando http: // qualcosa / qualcosa in https: // qualcosa / qualcosa ha funzionato per me. IE genera un errore che dice "permesso negato" quando il codice di stato è 0, altri browser no.


In questo caso, Chrome attualmente lascerà la richiesta in uno stato "Stalled" fino al timeout. Può essere causato da un flag Strict-Transport-Security restituito in una precedente richiesta da quel server, oppure può essere un flag Secure / HttpOnly su un cookie inviato con la richiesta.
Shane Hughes,

7

È importante notare che le chiamate ajax possono fallire anche all'interno di una sessione definita da un cookie con un determinato dominio con prefisso www. Quando poi chiami il tuo script php, ad esempio senza il www. prefisso nell'URL, la chiamata fallirà e anche viceversa.


4

Questo articolo mi ha aiutato. Stavo inviando il modulo tramite AJAX e ho dimenticato di utilizzare return false(dopo la mia richiesta Ajax) che ha portato alla presentazione del modulo classico ma stranamente non è stato completato.


Dawn Odio il fatto di essere stato catturato di nuovo da questo! <form onsubmit="return false;">ha fatto il trucco.
Heitor il

3

Perché questo si presenta quando google ajax status 0 Volevo lasciare qualche suggerimento che mi ha portato solo ore di tempo sprecato ... Stavo usando Ajax per chiamare un servizio PHP che è successo essere REST_Controller di Phil per Codeigniter (non sono sicuro che questo abbia qualcosa a che fare con esso o meno) e continuava a ottenere lo stato 0, pronto 0 e mi stava facendo impazzire. Lo stavo eseguendo il debug e ho notato quando avrei echeggiato e restituito invece di uscire dal messaggio avrei avuto successo. Alla fine ho disattivato il debug e provato e ha funzionato. Sembra che il debugger xDebug con PHP stesse in qualche modo modificando la risposta. Se stai usando un debugger PHP prova a disattivarlo per vedere se questo aiuta.


3

Ho trovato un altro caso in cui jquery ti dà il codice di stato 0 - se per qualche ragione XMLHttpRequest non è definito, otterrai questo errore.

Ovviamente questo non accadrà normalmente sul web, ma un bug in una build di firefox notturna ha causato la sua comparsa in un componente aggiuntivo che stavo scrivendo. :)


1
Hai fatto un punto, ho avuto un problema con jQuery.ajax()l'oggetto XHR. La richiesta non è stata nemmeno creata su una chiamata AJAX, sempre ottenere f.open non è una funzione e un codice di stato 0. Causato da: stavo restituendo l' $.ajaxSettings.xhroggetto da $.ajaxSetup({xhr}), restituendo new window.XMLHttpRequest();invece risolto il problema
klimpond,


2

L'invio di moduli "accidentali" era esattamente il problema che stavo avendo. Ho appena rimosso del tutto i tag FORM e questo sembra risolvere il problema. Grazie a tutti!


2

Abbiamo riscontrato un problema simile - codice di stato 0 alla chiamata ajax jquery - e ci è voluta un'intera giornata per diagnosticare. Dato che nessuno aveva ancora menzionato questo motivo, ho pensato di condividere.

Nel nostro caso il problema era l'arresto anomalo del server HTTP. Alcuni bug in PHP stavano soffiando su Apache, quindi sul lato client sembrava così:

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

dove test.php conteneva il codice di crash. Nessun dato restituito dal server (nemmeno le intestazioni) => la chiamata ajax è stata interrotta con lo stato 0.


2

Nel mio caso, è stato causato eseguendo il mio server Django http://127.0.0.1:8000/ma inviando la chiamata Ajax http://localhost:8000/. Anche se ti aspetteresti che mappino allo stesso indirizzo, non si assicurano che non stai inviando le tue richieste a localhost.


2

Nel nostro caso, il collegamento alla pagina è stato modificato da https a http . Anche se gli utenti hanno effettuato l'accesso, è stato impedito il caricamento con AJAX.


interessante. Spero sia il mio caso. Dato che il mio iframe si apre con https e in seguito al successo invio ajax su http quindi ottengo lo stato 0
sonico

1

Nel mio caso, l'impostazione delle url: ''impostazioni Ajax comporterebbe un codice di stato 0 in ie8 .. Sembra che ie semplicemente non tolleri tale impostazione.


1

Per me, il problema è stato causato dalla società di hosting (Godaddy) che tratta le operazioni POST che avevano dati di risposta sostanziali (qualcosa di più di decine di kilobyte) come una sorta di minaccia alla sicurezza. Se più di 6 di questi si sono verificati in un minuto, l'host ha rifiutato di eseguire il codice PHP che ha risposto alla richiesta POST durante il minuto successivo. Non sono del tutto sicuro di cosa abbia fatto invece l'host, ma ho visto, con tcpdump, un pacchetto di ripristino TCP in arrivo come risposta a una richiesta POST dal browser. Ciò ha comportato che il codice di stato http restituito in un oggetto jqXHR fosse 0.

La modifica delle operazioni da POST a GET ha risolto il problema. Non è chiaro perché Godaddy imponga questo limite, ma cambiare il codice è stato più semplice che cambiare l'host.


1

Penso di sapere cosa potrebbe causare questo errore.

In Google Chrome è presente una funzionalità integrata per prevenire attacchi ddos ​​per le estensioni di Google Chrome.

Quando le richieste Ajax restituiscono continuamente più di 500 errori di stato, iniziano a limitare le richieste.

Quindi è possibile ricevere lo stato 0 sulle seguenti richieste.


1

Nel tentativo di vincere il premio per la ragione più stupida del problema descritto.

Dimenticare di chiamare

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

Sì, stavo ancora ottenendo ritorni di stato pari a zero dalla chiamata "aperta".


1

Nel mio caso, stavo ottenendo questo, ma solo su Safari Mobile. Il problema è che stavo usando l'URL completo ( http://example.com/whatever.php ) invece di quello relativo (whatever.php). Questo non ha alcun senso però, non può essere un problema XSS perché il mio sito è ospitato su http://example.com . Immagino che Safari guardi la parte http e la contrassegni automaticamente come una richiesta non sicura senza ispezionare il resto dell'URL.


1

Nella mia risoluzione dei problemi, ho scoperto che AJAX xmlhttpRequest.status == 0 potrebbe significare che la chiamata client NON ha ancora raggiunto il server, ma non è riuscita a causa di un problema sul lato client. Se la risposta proveniva dal server, lo stato deve essere il codice di risposta HTTP 1xx / 2xx / 3xx / 4xx / 5xx. D'ora in poi, la risoluzione dei problemi si concentrerà sul problema del CLIENTE e potrebbe essere la connessione alla rete Internet inattiva o una di quelle descritte da @Langdon sopra.


0

Osservare la console del browser mentre si effettua la richiesta, se viene visualizzato il messaggio "La stessa politica di origine non consente la lettura della risorsa remota su http ajax ..... motivo: mancante l'intestazione cors" access-control-allow-origin "mancante", è necessario aggiungi "Access-Control-Allow-Origin" nell'intestazione della risposta. exa: in Java è possibile impostare questo come response.setHeader ("Access-Control-Allow-Origin", "*") dove la risposta è HttpServletResponse.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.