Чому AJAX повертає код статусу HTTP 0?


139

Чомусь під час використання AJAX (з моїм розроблена програма) браузер просто припиняє завантажувати та повертає коди статусу 0. Чому це відбувається?

Відповіді:


110

Інший випадок:

Можливо отримати код статусу, 0якщо ви надіслали дзвінок AJAX, а оновлення браузера було запущено до отримання відповіді на AJAX . Виклик AJAX буде відмінено, і ви отримаєте цей статус.


9
Дякую за вказівку на це, це дозволило мені зрозуміти, що (як і оновлення браузера) подання форми може скасувати виклик Ajax.
Магнус Сміт

1
Просто зробіть<form onsubmit="return false;">
Гейтор

1
@ Пропозиція Гейтора спрацювала для мене - кнопка "подати" моєї форми оновлювала сторінку, тим часом у мене був JavaScript, який намагався запустити виклик Ajax, коли натиснула кнопку "подати". Результатом було те, що дзвінок «
Аякса»

Гей, я пропустивe.preventDefault();
SparK

97

На мій досвід, ви побачите статус 0, коли:

  • робити сценарій між сайтом (де заборонено доступ)
  • запит URL-адреси, недоступного (помилка друку, проблеми з DNS тощо)
  • запит перехоплений інакше (перевірте блокатор оголошень)
  • як зазначено вище, якщо запит перервано (браузер відходить від сторінки)

1
Я отримую це, коли в зв’язку відмовлено. Наприклад, при налагодженні мого сайту в Visual Studio, якщо я зупинив сеанс налагодження, будь-який запит, який намагався підключити, отримає net :: ERR_CONNECTION_REFUSED і код стану буде нульовим. Це має сенс, оскільки ви не можете мати код статусу, якщо ви не можете підключитися до сервера, який повинен його надавати.
Трайнко

Я можу підтвердити. У мене є статус == 0 після відключення веб-сервера.
9ilsdx 9rvj 0lo

у мене є помилки через "міжсайтовий сценарій"; що я повинен зробити?

1
@nasimjahednia пошук CORS ... сервер, до якого ви намагаєтеся отримати доступ, повинен дозволити сценарії між веб-сайтами з вашого домену.
Ленґдон

Я збентежений. Чи немає способу повернути код помилки HTTP? Тут багато різних випадків (415, 404 тощо?)
Едвін Еванс,

8

Тут же проблема при використанні <button onclick="">submit</button>. Потім вирішується за допомогою<input type="button" onclick="">


1
Бінго !! Кожен може пояснити, чому це?
Хорхе

3
За замовчуванням тип кнопки HTML - "надіслати", тож натискання на нього спробує надіслати дані форми. Таким чином, він виконає дію натискання, а потім спробу подати. Якщо ви використовуєте тип "кнопка", він більше не є типовим типом і виконуватиме лише onclick.
Крістоф Руссі

7

Код статусу 0 означає, що запитуваний URL недоступний. Змінивши http: // щось / щось на https: // щось / щось працювало на мене. IE видає помилку, кажучи "дозволу відмовлено", коли код статусу 0, інші браузери не роблять.


У такому випадку хром наразі залишить запит у "застопореному" стані, поки його час не закінчиться. Його може спричинити або прапор суворої транспортної безпеки, повернутий у попередньому запиті з цього сервера, або це може бути прапор Secure / HttpOnly у файлі cookie, що надсилається із запитом.
Шейн Х'юз

7

Важливо зауважити, що виклики ajax можуть не працювати навіть у межах сеансу, який визначається файлом cookie з певним доменом з префіксом www. Коли ви зателефонуєте до свого сценарію php, наприклад, без www. префікса в URL-адресі, виклик не вдасться і viceversa.


4

Ця стаття мені допомогла. Я надсилав форму через AJAX і забув використовувати return false(після мого запиту на ajax), що призвело до подання класичної форми, але, як не дивно, вона не була заповнена.


Світанок я ненавиджу те, що мене знову зловив цей! <form onsubmit="return false;">зробив трюк.
Гейтор

3

Оскільки це відображається, коли ви перебуваєте в google ajax status 0, я хотів залишити підказку, яка просто зайняла у мене витрачені години ... Я використовував ajax для виклику служби PHP, яка трапилася в REST_Controller Філа для Codeigniter (не впевнений, чи це що-небудь робити з цим чи ні) і продовжував отримувати статус 0, Readystate 0, і це мене заганяло. Я налагоджував це і помічав, коли я відлуню і повернуться замість виходу з повідомлення, я отримав би успіх. Нарешті я відключив налагодження і спробував, і це спрацювало. Здається, налагоджувач xDebug з PHP якимось чином змінював відповідь. Якщо ви використовуєте відладчик PHP, спробуйте вимкнути його, щоб побачити, чи це допомагає.


3

Я знайшов інший випадок, коли jquery дає код статусу 0 - якщо з якихось причин XMLHttpRequest не визначено, ви отримаєте цю помилку.

Очевидно, що це зазвичай не трапляється в Інтернеті, але помилка в нічній версії Firefox призвела до того, що це з'явилося у додатку, про який я писав. :)


1
Ви задумали, у мене виникла проблема з jQuery.ajax()об'єктом XHR. Запит навіть не був створений під час виклику AJAX, все-таки отримання f.open не є функцією та кодом статусу 0. Викликано: Я повертався з $.ajaxSettings.xhrоб'єкта $.ajaxSetup({xhr}), повертаючись new window.XMLHttpRequest();замість цього, вирішив проблему
klimpond


2

"Випадкове" подання форми було саме тією проблемою, яку я мав. Я щойно видалив мітки ФОРМУ і це, здається, вирішило проблему. Дякую всім!


2

У нас була подібна проблема - код статусу 0 при виклику jquery ajax - і нам знадобився цілий день, щоб діагностувати її. Оскільки про цю причину ніхто ще не згадував, я думав, що поділюсь.

У нашому випадку проблема полягала в збої HTTP-сервера. Якась помилка в PHP видувала Apache, тож на клієнтському кінці це виглядало так:

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

де test.php містив код збоїв. Жодних даних, повернутих із сервера (навіть заголовки) => виклик ajax не було перервано зі статусом 0.


2

У моєму випадку це було викликано запуском мого сервера django під, http://127.0.0.1:8000/але надсиланням дзвінка ajax на http://localhost:8000/. Незважаючи на те, що ви очікуєте, що вони віднесуть до однієї адреси, вони не переконайтеся, що ви не надсилаєте свої запити до localhost.


2

У нашому випадку посилання на сторінку було змінено з https на http . Незважаючи на те, що користувачі ввійшли в систему, їм не вдалося завантажити AJAX.


цікаво. Я сподіваюся, що це моя справа. Оскільки мій iframe відкривається https, а за результатами успіху я надсилаю ajax на http, то я отримую статус 0
sonic

1

У моєму випадку, встановлення url: ''в налаштуваннях ajax призведе до коду статусу 0 в ie8. Здається, тобто просто не терпить такого налаштування.


1

Для мене цю проблему викликала компанія-хостинг (Godaddy), яка розглядала операції POST, які мали суттєві дані відгуку (що-небудь більше десятків кілобайт) як якусь загрозу безпеці. Якщо більше 6 з них відбулося за одну хвилину, хост відмовився виконувати код PHP, який відповів на запит POST протягом наступної хвилини. Я не зовсім впевнений у тому, що хост робив замість цього, але з tcpdump я побачив пакет скидання TCP, який надходить як відповідь на POST-запит від браузера. Це призвело до того, що код статусу http, що повертається в об'єкті jqXHR, дорівнює 0.

Зміна операцій з POST на GET виправила проблему. Не ясно, чому Godaddy нав'язує цю межу, але змінити код було простіше, ніж змінити хост.


1

Я думаю, я знаю, що може спричинити цю помилку.

У Google Chrome є вбудована функція для запобігання ddos-атак для розширень Google Chrome.

Коли запити ajax постійно повертають 500+ помилок статусу, він починає придушувати запити.

Отже, можна отримати статус 0 за наступними запитами.


1

У спробі виграти приз з найбільш глупої причини описаної проблеми.

Забувши дзвонити

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

Так, я все одно отримував нульові повернення статусу від "відкритого" дзвінка.


1

У моєму випадку я отримував це, але тільки на Safari Mobile. Проблема полягає в тому, що я використовував повну URL-адресу ( http://example.com/wever.php ) замість відносної (незалежно.php). Це не має сенсу, але це не може бути проблемою XSS, оскільки мій сайт розміщено на веб-сайті http://example.com . Я думаю, що Safari розглядає частину http і автоматично позначає її як незахищений запит, не перевіряючи решту URL-адреси.


1

Під час усунення несправностей я виявив, що цей AJAX xmlhttpRequest.status == 0 може означати, що дзвінок клієнта ще НЕ дойшов до сервера, але не вдався через проблему на стороні клієнта. Якщо відповідь була від сервера, то статус повинен бути або тим 1xx / 2xx / 3xx / 4xx / 5xx HTTP-кодом відповіді. Відтепер усунення несправностей має зосереджуватися на проблемі КЛІЄНТА, а це може бути відключення мережевої мережі Інтернет або одне з описаних вище @Langdon.


0

Під час подання запиту дотримуйтесь консолі веб-переглядача, якщо ви бачите "Політика того самого джерела забороняє читати віддалений ресурс на http ajax ..... причина: заголовок cors" доступ-контроль-дозвіл-походження "відсутній", тоді вам потрібно додайте у заголовок відповіді "Access-Control-Allow-Origin". екза: у Java ви можете встановити це як response.setHeader ("Access-Control-Allow-Origin", "*"), де відповідь - HttpServletResponse.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.