¿Por qué AJAX devuelve el código de estado HTTP 0?

139

Por alguna razón, mientras uso AJAX (con mi aplicación desarrollada) el navegador simplemente deja de cargar y devuelve códigos de estado de 0. ¿Por qué pasó esto?

Tarnfeld
fuente

Respuestas:

110

Otro caso:

Podría ser posible obtener un código de estado 0si ha enviado una llamada AJAX y se activó una actualización del navegador antes de obtener la respuesta AJAX . La llamada AJAX se cancelará y obtendrá este estado.

mnk
fuente
9
Gracias por señalar esto, me llevó a darme cuenta de que (además de una actualización del navegador) un envío de formulario puede cancelar la llamada ajax.
Magnus Smith
1
Solo hazlo<form onsubmit="return false;">
Heitor
1
La sugerencia de @ Heitor funcionó para mí: el botón "enviar" de mi formulario estaba actualizando la página, mientras que tenía JavaScript intentando ejecutar una llamada ajax cuando se hizo clic en el botón "enviar". El resultado fue que la llamada ajax fue cancelada
Nic Scozzaro
Hola, me perdí une.preventDefault();
SparK
97

En mi experiencia, verá un estado de 0 cuando:

  • haciendo secuencias de comandos entre sitios (donde se deniega el acceso)
  • Solicitar una URL que no sea accesible (error tipográfico, problemas de DNS, etc.)
  • la solicitud se intercepta de otra manera (verifique su bloqueador de anuncios)
  • como arriba, si la solicitud se interrumpe (el navegador se aleja de la página)
Langdon
fuente
1
Lo entiendo cuando se rechaza la conexión. Por ejemplo, al depurar mi sitio con Visual Studio, si he detenido la sesión de depuración, cualquier solicitud que intente conectarse obtendrá net :: ERR_CONNECTION_REFUSED y el código de estado será cero. Eso tiene sentido, ya que no puede tener un código de estado si no puede conectarse al servidor que se supone que debe proporcionar uno.
Triynko
Puedo confirmar. Tengo status == 0 después de apagar mi servidor web.
9ilsdx 9rvj 0lo
tengo errores debido a 'scripting entre sitios'; ¿Qué tengo que hacer?
1
@nasimjahednia lookup CORS ... el servidor al que está intentando acceder necesita permitir secuencias de comandos de sitios cruzados desde su dominio.
Langdon
Estoy confundido. ¿No hay forma de obtener el código de error HTTP devuelto? Aquí hay muchos casos diferentes (415, 404, etc.)
Edwin Evans
8

El mismo problema aquí cuando se usa <button onclick="">submit</button>. Luego resuelto usando<input type="button" onclick="">

Rafi
fuente
1
¡¡Bingo!! Alguien puede explicar por qué esto?
Jorge
3
Por defecto, el tipo de botón HTML es 'enviar', por lo que al hacer clic en él se intentará enviar los datos del formulario. Entonces ejecutará la acción de clic, luego intentará enviar. Si usa el tipo 'botón', ya no es el tipo predeterminado y solo realizará un clic.
Christophe Roussy
7

El código de estado 0 significa que no se puede acceder a la URL solicitada. Al cambiar http: // something / something a https: // something / something funcionó para mí. IE arroja un error que dice "permiso denegado" cuando el código de estado es 0, otros navegadores no.

Jagadeesh
fuente
En este caso, Chrome actualmente dejará la solicitud en un estado "Atascado" hasta que se agote el tiempo de espera. Puede ser causada por un indicador de Seguridad de transporte estricto devuelto en una solicitud anterior de ese servidor, o puede ser un indicador de Seguridad / HttpOnly en una cookie que se envía con la solicitud.
Shane Hughes
7

Es importante tener en cuenta que las llamadas ajax pueden fallar incluso dentro de una sesión definida por una cookie con un determinado dominio con el prefijo www. Cuando llama a su script php, por ejemplo, sin www. prefijo en la url, la llamada fallará y viceversa, también.

nuxxxx
fuente
4

Este artículo me ayudó. Estaba enviando el formulario a través de AJAX y olvidé usarlo return false(después de mi solicitud de ajax), lo que condujo al envío del formulario clásico, pero extrañamente no se completó.

Martin Vseticka
fuente
Dawn ¡Odio el hecho de que este me atrapó otra vez! <form onsubmit="return false;">Hizo el truco.
Heitor
3

Debido a que esto aparece cuando googleas el estado 0 de ajax, quería dejar un consejo que solo me llevó horas de tiempo perdido ... Estaba usando ajax para llamar a un servicio PHP que resultó ser el REST_Controller de Phil para Codeigniter (no estoy seguro de si esto tiene nada que ver con eso o no) y seguí obteniendo el estado 0, listo estado 0 y me estaba volviendo loco. Lo estaba depurando y noté cuándo haría eco y regresaría en lugar de salir del mensaje que obtendría un éxito. Finalmente apagué la depuración e intenté y funcionó. Parece que el depurador xDebug con PHP estaba modificando de alguna manera la respuesta. Si está utilizando un depurador PHP, intente desactivarlo para ver si eso ayuda.

Miguel
fuente
3

Encontré otro caso en el que jquery le da el código de estado 0: si por alguna razón XMLHttpRequest no está definido, obtendrá este error.

Obviamente, esto normalmente no sucederá en la web, pero un error en una versión nocturna de Firefox hizo que esto apareciera en un complemento que estaba escribiendo. :)

estrellado
fuente
1
Hiciste un punto, tuve un problema con el jQuery.ajax()objeto XHR. La solicitud ni siquiera se creó en la llamada AJAX, todavía obteniendo f.open no es una función y un código de estado 0. Causado por: Estaba devolviendo un $.ajaxSettings.xhrobjeto $.ajaxSetup({xhr}), pero en new window.XMLHttpRequest();cambio resolví el problema
klimpond
2

El envío de formularios "accidentales" fue exactamente el problema que estaba teniendo. Acabo de eliminar las etiquetas FORM por completo y eso parece solucionar el problema. ¡Gracias a todos!

Insider Pro
fuente
2

Tuvimos un problema similar, el código de estado 0 en la llamada jquery ajax, y nos tomó todo el día diagnosticarlo. Como nadie había mencionado esta razón todavía, pensé en compartir.

En nuestro caso, el problema fue el bloqueo del servidor HTTP. Algún error en PHP estaba apagando Apache, por lo que en el extremo del cliente se veía así:

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

donde test.php contenía el código de bloqueo. No se devolvieron datos del servidor (ni siquiera los encabezados) => la llamada ajax se canceló con el estado 0.

jmper
fuente
2

En mi caso, fue causado por ejecutar mi servidor django http://127.0.0.1:8000/pero enviando la llamada ajax a http://localhost:8000/. Aunque esperaría que se asignaran a la misma dirección, no se aseguran de que no envíe sus solicitudes a localhost.

Vlad Schnakovszki
fuente
2

En nuestro caso, el enlace de la página cambió de https a http . Aunque los usuarios iniciaron sesión, se les impidió cargar con AJAX.

Andy en NC
fuente
interesante. Espero que sea mi caso. Dado que mi iframe se abre con https y en el resultado exitoso, envío ajax a http y luego obtengo el estado 0
sonic
1

En mi caso, establecer la configuración url: ''de ajax daría como resultado un código de estado 0 en ie8 .. Parece que es decir, simplemente no tolera dicha configuración.

desenfoque
fuente
1

Para mí, el problema fue causado por la empresa de alojamiento (Godaddy) que trataba las operaciones POST que tenían datos de respuesta sustanciales (algo más que decenas de kilobytes) como algún tipo de amenaza para la seguridad. Si ocurrieron más de 6 de estas en un minuto, el host se negó a ejecutar el código PHP que respondió a la solicitud POST durante el siguiente minuto. No estoy completamente seguro de lo que hizo el host en su lugar, pero vi, con tcpdump, un paquete de restablecimiento de TCP que viene como respuesta a una solicitud POST del navegador. Esto provocó que el código de estado http devuelto en un objeto jqXHR fuera 0.

Cambiar las operaciones de POST a GET solucionó el problema. No está claro por qué Godaddy impone este límite, pero cambiar el código fue más fácil que cambiar el host.

emrys57
fuente
1

Creo que sé qué puede causar este error.

En google chrome hay una función incorporada para evitar ataques ddos ​​para las extensiones de google chrome.

Cuando las solicitudes ajax devuelven continuamente más de 500 errores de estado, comienza a limitar las solicitudes.

Por lo tanto, es posible recibir el estado 0 en las siguientes solicitudes.

Anónimo
fuente
1

En un intento de ganar el premio por la razón más tonta del problema descrito.

Olvidando llamar

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

Sí, todavía recibía devoluciones de estado de cero de la llamada 'abierta'.

Gordon Rouse
fuente
1

En mi caso, estaba obteniendo esto, pero solo en Safari Mobile. El problema es que estaba usando la URL completa ( http://example.com/whatever.php ) en lugar de la relativa (whatever.php). Sin embargo, esto no tiene ningún sentido, no puede ser un problema de XSS porque mi sitio está alojado en http://example.com . Supongo que Safari mira la parte http y la marca automáticamente como una solicitud insegura sin inspeccionar el resto de la URL.

Raúl Bojalil
fuente
1

En mi resolución de problemas, encontré que AJAX xmlhttpRequest.status == 0 podría significar que la llamada del cliente NO había llegado al servidor todavía, pero falló debido a un problema en el lado del cliente. Si la respuesta fue del servidor, entonces el estado debe ser el código de respuesta HTTP 1xx / 2xx / 3xx / 4xx / 5xx HTTP. En adelante, la resolución de problemas se centrará en el problema del CLIENTE, y podría ser una conexión de red de Internet inactiva o una de las descritas anteriormente por @Langdon.

Panini Luncher
fuente
0

Observe la consola del navegador mientras realiza la solicitud, si ve "La misma política de origen no permite leer el recurso remoto en http ajax ..... razón: falta el encabezado cors 'access-control-allow-origin'", entonces necesita agregue "Access-Control-Allow-Origin" en el encabezado de respuesta. exa: en java puede configurar esto como response.setHeader ("Access-Control-Allow-Origin", "*") donde la respuesta es HttpServletResponse.

Mahadev Mandale
fuente