Почему AJAX возвращает код состояния HTTP 0?

140

По какой-то причине при использовании AJAX (с моим разработанное приложение) браузер просто прекращает загрузку и возвращает коды состояния 0. Почему так происходит?

Tarnfeld
источник

Ответы:

111

Другой случай:

Можно получить код состояния, 0если вы отправили вызов AJAX и обновление браузера было запущено до получения ответа AJAX . Вызов AJAX будет отменен, и вы получите этот статус.

mnk
источник
9
Спасибо за указание на это, это заставило меня понять, что (а также обновление браузера) отправка формы может отменить вызов ajax.
Магнус Смит
2
Just do<form onsubmit="return false;">
Heitor
1
Предложение @ Heitor сработало для меня - моя кнопка «отправить» в форме обновляла страницу, а у меня был javascript, пытающийся запустить вызов ajax при нажатии кнопки «отправить». Результатом стало то, что вызов ajax был отменен
Ник Скоззаро
Эй, я пропустилe.preventDefault();
SparK
100

По моему опыту, вы увидите статус 0, когда:

  • выполнение межсайтовых сценариев (где доступ запрещен)
  • запрос недоступного URL (опечатка, проблемы с DNS и т. д.)
  • в противном случае запрос будет перехвачен (проверьте свой блокировщик рекламы)
  • как указано выше, если запрос прерывается (браузер уходит со страницы)
Лэнгдон
источник
1
Получаю, когда в соединении отказано. Например, при отладке моего сайта с помощью Visual Studio, если я остановил сеанс отладки, любой запрос, который пытался подключиться, получит net :: ERR_CONNECTION_REFUSED, а код состояния будет равен нулю. Это имеет смысл, поскольку у вас не может быть кода состояния, если вы не можете подключиться к серверу, который должен его предоставлять.
Трийнко 07
Я могу подтвердить. У меня статус == 0 после выключения моего веб-сервера.
9ilsdx 9rvj 0lo
у меня есть ошибки из-за "межсайтового скриптинга"; что я должен делать?
1
@nasimjahednia lookup CORS ... сервер, к которому вы пытаетесь получить доступ, должен разрешать межсайтовый скриптинг из вашего домена.
Лэнгдон
Я в замешательстве. Нет ли способа вернуть код ошибки HTTP? Здесь много разных случаев (415, 404 и т.д.?)
Эдвин Эванс,
8

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

Рафи
источник
1
Бинго !! Кто-нибудь может объяснить, почему это?
Хорхе
3
По умолчанию тип кнопки HTML - «отправить», поэтому при нажатии на нее выполняется попытка отправки данных формы. Таким образом, он выполнит действие щелчка, а затем попытается отправить. Если вы используете тип «кнопка», это больше не тип по умолчанию и будет выполняться только при нажатии.
Christophe
7

Код состояния 0 означает, что запрошенный URL недоступен. Изменив http: // something / something на https: // something / something, у меня сработало. IE выдает сообщение об ошибке «разрешение отклонено», когда код состояния равен 0, другие браузеры этого не делают.

Джагадиш
источник
В этом случае Chrome в настоящее время оставит запрос в состоянии «Заедание» до истечения времени ожидания. Это может быть вызвано либо флагом Strict-Transport-Security, возвращенным в предыдущем запросе с этого сервера, либо флагом Secure / HttpOnly для файла cookie, отправляемого с запросом.
Шейн Хьюз
7

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

nuxxxx
источник
4

Эта статья мне помогла. Я отправлял форму через AJAX и забыл использовать return false(после моего запроса ajax), что привело к отправке классической формы, но, как ни странно, она не была завершена.

Мартин Всетицка
источник
Рассвет, я ненавижу тот факт, что меня снова поймали на этом! <form onsubmit="return false;">сделали свое дело.
Heitor
3

Поскольку это появляется, когда вы google ajax status 0, я хотел оставить совет, который просто занял у меня несколько часов потраченного впустую времени ... Я использовал ajax для вызова службы PHP, которая оказалась REST_Controller Фила для Codeigniter (не уверен, что это ничего общего с этим или нет) и продолжал получать статус 0, состояние готовности 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

«Случайная» отправка формы была именно той проблемой, с которой я столкнулся. Я просто полностью удалил теги FORM и, похоже, решил проблему. Спасибо всем!

Insider Pro
источник
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.

jmper
источник
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 .. Кажется, что ie просто не допускает такой настройки.

Blurrcat
источник
1

Для меня проблема была вызвана тем, что хостинговая компания (Godaddy) рассматривала операции POST, которые содержали значительные данные ответа (не более десятков килобайт), как своего рода угрозу безопасности. Если за одну минуту произошло более 6 из них, хост отказывался выполнять код PHP, который ответил на запрос POST в течение следующей минуты. Я не совсем уверен, что хост сделал вместо этого, но я видел, с tcpdump, пакет сброса TCP, приходящий в качестве ответа на запрос POST из браузера. Это привело к тому, что код состояния http, возвращаемый в объекте jqXHR, был равен 0.

Изменение операций с POST на GET устранило проблему. Непонятно, почему Godaddy устанавливает это ограничение, но изменить код было проще, чем изменить хост.

emrys57
источник
1

Думаю, я знаю, что может вызвать эту ошибку.

В google chrome есть встроенная функция для предотвращения ddos-атак для расширений google chrome.

Когда запросы ajax постоянно возвращают более 500 ошибок статуса, он начинает регулировать запросы.

Следовательно, можно получить статус 0 по следующим запросам.

Анонимный
источник
1

В попытке выиграть приз по самой глупой причине описанной проблемы.

Забыв позвонить

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

Да, я все еще получал нулевой статус при вызове open.

Гордон Роуз
источник
1

В моем случае я получал это, но только в Safari Mobile. Проблема в том, что я использовал полный URL ( http://example.com/whatever.php ) вместо относительного (something.php). Это не имеет никакого смысла, это не может быть проблемой XSS, потому что мой сайт размещен на http://example.com . Я предполагаю, что Safari смотрит на http-часть и автоматически помечает ее как небезопасный запрос, не проверяя остальную часть URL-адреса.

Рауль Бохалил
источник
1

При устранении неполадок я обнаружил, что этот AJAX xmlhttpRequest.status == 0 может означать, что клиентский вызов еще НЕ достиг сервера, но не удалось из-за проблемы на стороне клиента. Если ответ был от сервера, то статус должен быть либо с кодом ответа HTTP 1xx / 2xx / 3xx / 4xx / 5xx. Отныне устранение неполадок будет сосредоточено на проблеме КЛИЕНТА, и это может быть отключение сетевого подключения к Интернету или одно из тех, что описаны @Langdon выше.

Панини Ланчер
источник
0

Наблюдайте за консолью браузера при выполнении запроса, если вы видите, что «Политика того же происхождения запрещает чтение удаленного ресурса по http ajax ..... причина: заголовок cors 'access-control-allow-origin' отсутствует», то вам необходимо добавьте в заголовок ответа «Access-Control-Allow-Origin». exa: в java вы можете установить это как response.setHeader ("Access-Control-Allow-Origin", "*"), где ответ HttpServletResponse.

Махадев Мандале
источник