Pourquoi AJAX renvoie-t-il le code d'état HTTP 0?

139

Pour une raison quelconque, lors de l'utilisation d'AJAX (avec mon application développée) le navigateur arrête simplement le téléchargement et renvoie les codes d'état de 0. Pourquoi cela arrive-t-il?

Tarnfeld
la source

Réponses:

110

Un autre cas:

Il peut être possible d'obtenir un code d'état indiquant 0si vous avez envoyé un appel AJAX et qu'une actualisation du navigateur a été déclenchée avant d'obtenir la réponse AJAX . L'appel AJAX sera annulé et vous obtiendrez ce statut.

mnk
la source
9
Merci de l'avoir signalé, cela m'a conduit à réaliser que (en plus d'un rafraîchissement du navigateur), une soumission de formulaire peut annuler l'appel ajax.
Magnus Smith
1
Just do<form onsubmit="return false;">
Heitor
1
La suggestion de @ Heitor a fonctionné pour moi - le bouton «Soumettre» de mon formulaire rafraîchissait la page, pendant ce temps, javascript essayait d'exécuter un appel ajax lorsque le bouton «Soumettre» était cliqué. Le résultat était que l'appel ajax a été annulé
Nic Scozzaro
Hé, j'ai raté une.preventDefault();
SparK
97

D'après mon expérience, vous verrez un statut de 0 lorsque:

  • faire des scripts intersites (où l'accès est refusé)
  • demander une URL inaccessible (faute de frappe, problèmes DNS, etc.)
  • sinon la demande est interceptée (vérifiez votre bloqueur de publicité)
  • comme ci-dessus, si la demande est interrompue (le navigateur s'éloigne de la page)
Langdon
la source
1
Je l'obtiens lorsque la connexion est refusée. Par exemple, lors du débogage de mon site avec Visual Studio, si j'ai arrêté la session de débogage, toute demande qui a tenté de se connecter obtiendra net :: ERR_CONNECTION_REFUSED et le code d'état sera zéro. Cela a du sens, car vous ne pouvez pas avoir de code d'état si vous ne pouvez pas vous connecter au serveur qui est censé en fournir un.
Triynko
Je peux confirmer. J'ai le statut == 0 après avoir arrêté mon serveur Web.
9ilsdx 9rvj 0lo
j'ai des erreurs à cause du «script intersite»; que devrais-je faire?
1
@nasimjahednia lookup CORS ... le serveur auquel vous essayez d'accéder doit autoriser les scripts intersites à partir de votre domaine.
Langdon
Je suis confus. N'existe-t-il aucun moyen d'obtenir le code d'erreur HTTP renvoyé? C'est beaucoup de cas différents ici (415, 404, etc.?)
Edwin Evans
8

Même problème ici lors de l'utilisation <button onclick="">submit</button>. Puis résolu en utilisant<input type="button" onclick="">

Rafi
la source
1
Bingo !! N'importe qui peut expliquer pourquoi cela?
Jorge
3
Par défaut, le type de bouton HTML est «Soumettre». En cliquant dessus, vous tenterez de soumettre les données du formulaire. Il exécutera donc l'action de clic, puis tentera de soumettre. Si vous utilisez le type 'bouton', ce n'est plus le type par défaut et ne fonctionnera que sur clic.
Christophe Roussy
7

Le code d'état 0 signifie que l'URL demandée n'est pas accessible. En changeant http: // quelque chose / quelque chose en https: // quelque chose / quelque chose a fonctionné pour moi. IE jette une erreur indiquant "permission refusée" lorsque le code d'état est 0, les autres navigateurs ne le font pas.

Jagadeesh
la source
Dans ce cas, Chrome laissera actuellement la requête dans un état "bloqué" jusqu'à ce qu'elle expire. Cela peut être dû soit à un indicateur Strict-Transport-Security renvoyé dans une demande précédente de ce serveur, soit à un indicateur Secure / HttpOnly sur un cookie envoyé avec la demande.
Shane Hughes
7

Il est important de noter que les appels ajax peuvent échouer même dans une session définie par un cookie avec un certain domaine préfixé par www. Lorsque vous appelez ensuite votre script php, par exemple sans le www. préfixe dans l'url, l'appel échouera et vice-versa également.

nuxxxx
la source
4

Cet article m'a aidé. J'étais en train de soumettre le formulaire via AJAX et j'ai oublié de l'utiliser return false(après ma demande ajax), ce qui a conduit à la soumission d'un formulaire classique mais étrangement, il n'a pas été complété.

Martin Vseticka
la source
Dawn, je déteste le fait que j'ai été attrapé par celui-ci à nouveau! <form onsubmit="return false;">a fait l'affaire.
Heitor
3

Parce que cela apparaît lorsque vous google ajax status 0 Je voulais laisser un conseil qui m'a juste pris des heures de temps perdu ... J'utilisais ajax pour appeler un service PHP qui se trouvait être le REST_Controller de Phil pour Codeigniter (je ne sais pas si cela a quoi que ce soit à voir avec ou non) et a continué à obtenir le statut 0, à réinstaller 0 et cela me rendait fou. J'étais en train de le déboguer et j'ai remarqué que lorsque j'échouais et retournais au lieu de quitter le message, j'obtiendrais un succès. Enfin, j'ai désactivé le débogage et essayé et cela a fonctionné. Il semble que le débogueur xDebug avec PHP modifiait en quelque sorte la réponse. Si vous utilisez un débogueur PHP, essayez de le désactiver pour voir si cela vous aide.

Michael
la source
3

J'ai trouvé un autre cas où jquery vous donne le code de statut 0 - si pour une raison quelconque XMLHttpRequest n'est pas défini, vous obtiendrez cette erreur.

Évidemment, cela ne se produira normalement pas sur le Web, mais un bogue dans une version nocturne de Firefox l'a fait apparaître dans un add-on que j'écrivais. :)

affamé
la source
1
Vous avez fait un point, j'ai eu un problème avec l' jQuery.ajax()objet XHR. La demande n'a même pas été créée lors de l'appel AJAX, toujours obtenir f.open n'est pas une fonction et le code d'état 0. Causé par: Je retournais l' $.ajaxSettings.xhrobjet de $.ajaxSetup({xhr}), retournant à la new window.XMLHttpRequest();place résolu le problème
klimpond
2

La soumission de formulaire «accidentelle» était exactement le problème que j'avais. Je viens de supprimer complètement les balises FORM et cela semble résoudre le problème. Merci tout le monde!

Insider Pro
la source
2

Nous avons eu un problème similaire - code d'état 0 sur l'appel jquery ajax - et il nous a fallu une journée entière pour le diagnostiquer. Puisque personne n'avait encore mentionné cette raison, j'ai pensé partager.

Dans notre cas, le problème était un crash du serveur HTTP. Un bogue en PHP soufflait Apache, donc du côté du client, cela ressemblait à ceci:

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

où test.php contenait le code de plantage. Aucune donnée renvoyée par le serveur (pas même les en-têtes) => l'appel ajax a été abandonné avec l'état 0.

jmper
la source
2

Dans mon cas, cela a été causé par l'exécution de mon serveur django sous http://127.0.0.1:8000/mais l'envoi de l'appel ajax à http://localhost:8000/. Même si vous vous attendez à ce qu'ils soient mappés à la même adresse, ils ne s'assurent pas que vous n'envoyez pas vos demandes à localhost.

Vlad Schnakovszki
la source
2

Dans notre cas, le lien de la page est passé de https à http . Même si les utilisateurs étaient connectés, ils n'ont pas pu se charger avec AJAX.

Andy en NC
la source
intéressant. J'espère que c'est mon cas. Puisque mon iframe s'ouvre avec https et que le résultat est réussi, j'envoie ajax au http, puis j'obtiens le statut 0
sonic
1

Dans mon cas, la configuration url: ''dans les paramètres ajax entraînerait un code d'état 0 dans ie8 .. Il semble que c'est à dire ne tolère tout simplement pas un tel paramètre.

blurrcat
la source
1

Pour moi, le problème a été causé par la société d'hébergement (Godaddy) traitant les opérations POST qui avaient des données de réponse substantielles (plus de dizaines de kilo-octets) comme une sorte de menace pour la sécurité. Si plus de 6 d'entre eux se sont produits en une minute, l'hôte a refusé d'exécuter le code PHP qui a répondu à la requête POST pendant la minute suivante. Je ne suis pas tout à fait sûr de ce que l'hôte a fait à la place, mais j'ai vu, avec tcpdump, un paquet de réinitialisation TCP en réponse à une demande POST du navigateur. Cela faisait que le code d'état http renvoyé dans un objet jqXHR était 0.

La modification des opérations de POST à ​​GET a résolu le problème. On ne sait pas pourquoi Godaddy impose cette limite, mais changer le code était plus facile que de changer l'hôte.

emrys57
la source
1

Je pense que je sais ce qui peut causer cette erreur.

Dans google chrome, il existe une fonctionnalité intégrée pour empêcher les attaques ddos ​​pour les extensions google chrome.

Lorsque les demandes ajax renvoient continuellement plus de 500 erreurs d'état, elles commencent à limiter les demandes.

Par conséquent, il est possible de recevoir le statut 0 sur les demandes suivantes.

Anonyme
la source
1

Dans une tentative de gagner le prix pour la raison la plus stupide du problème décrit.

Oublier d'appeler

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

Oui, j'obtenais toujours des retours de statut de zéro de l'appel «ouvert».

Gordon Rouse
la source
1

Dans mon cas, je l'obtenais mais uniquement sur Safari Mobile. Le problème est que j'utilisais l'URL complète ( http://example.com/wwhat.php ) au lieu de l' URL relative (peu importe.php). Cela n'a aucun sens, cela ne peut pas être un problème XSS car mon site est hébergé sur http://example.com . Je suppose que Safari regarde la partie http et la marque automatiquement comme une demande non sécurisée sans inspecter le reste de l'URL.

Raúl Bojalil
la source
1

Dans mon dépannage, j'ai trouvé que ce AJAX xmlhttpRequest.status == 0 pouvait signifier que l'appel client n'avait pas encore atteint le serveur, mais avait échoué en raison d'un problème côté client. Si la réponse provenait du serveur, l'état doit être l'un des codes de réponse HTTP 1xx / 2xx / 3xx / 4xx / 5xx. Désormais, le dépannage se concentrera sur le problème du CLIENT et pourrait être une connexion réseau Internet interrompue ou l'un de ceux décrits par @Langdon ci-dessus.

Panini Luncher
la source
0

Observez la console du navigateur tout en effectuant la demande, si vous voyez "La même politique d'origine interdit la lecture de la ressource distante sur http ajax ..... raison: l'en-tête cors 'access-control-allow-origin' est manquant", vous devez ajoutez "Access-Control-Allow-Origin" dans l'en-tête de réponse. exa: en java, vous pouvez définir ceci comme response.setHeader ("Access-Control-Allow-Origin", "*") où la réponse est HttpServletResponse.

Mahadev Mandale
la source