Mengapa AJAX mengembalikan kode status HTTP 0?

140

Untuk beberapa alasan, saat menggunakan AJAX (dengan file aplikasi yang dikembangkan) browser hanya berhenti mengunggah dan mengembalikan kode status 0. Mengapa ini terjadi?

tarnfeld
sumber

Jawaban:

111

Kasus lain:

Dimungkinkan untuk mendapatkan kode status 0jika Anda telah mengirim panggilan AJAX dan penyegaran browser dipicu sebelum mendapatkan respons AJAX . Panggilan AJAX akan dibatalkan dan Anda akan mendapatkan status ini.

mnk
sumber
9
Terima kasih telah menunjukkan hal ini, itu membuat saya menyadari bahwa (serta penyegaran browser) pengiriman formulir dapat membatalkan panggilan ajax.
Magnus Smith
2
Lakukan saja<form onsubmit="return false;">
Heitor
1
Saran @ Heitor berhasil untuk saya - tombol "kirim" formulir saya menyegarkan halaman, sementara itu saya memiliki javascript yang mencoba menjalankan panggilan ajax ketika tombol "kirim" diklik. Hasilnya adalah panggilan ajax dibatalkan
Nic Scozzaro
Hei, aku melewatkane.preventDefault();
SparK
100

Menurut pengalaman saya, Anda akan melihat status 0 ketika:

  • melakukan skrip lintas situs (di mana akses ditolak)
  • meminta URL yang tidak dapat dijangkau (salah ketik, masalah DNS, dll)
  • permintaan itu disadap (periksa pemblokir iklan Anda)
  • seperti di atas, jika permintaan terganggu (browser keluar dari halaman)
Langdon
sumber
1
Saya mendapatkannya ketika koneksi ditolak. Misalnya, saat men-debug situs saya dengan Visual Studio, jika saya menghentikan sesi debugging, permintaan apa pun yang mencoba menyambung akan mendapatkan net :: ERR_CONNECTION_REFUSED dan kode status akan menjadi nol. Itu masuk akal, karena Anda tidak dapat memiliki kode status jika Anda tidak dapat terhubung ke server yang seharusnya menyediakannya.
Triynko
Saya bisa konfirmasi. Saya mendapat status == 0 setelah mematikan server web saya.
9ilsdx 9rvj 0lo
saya mengalami kesalahan karena 'pembuatan skrip lintas situs'; apa yang harus saya lakukan?
1
@nasimjahednia lookup CORS ... server yang Anda coba akses harus mengizinkan pembuatan skrip lintas situs dari domain Anda.
Langdon
Saya bingung. Apakah tidak ada cara untuk mengembalikan kode kesalahan HTTP? Ada banyak kasus berbeda di sini (415, 404, dll?)
Edwin Evans
8

Masalah yang sama di sini saat menggunakan <button onclick="">submit</button>. Kemudian diselesaikan dengan menggunakan<input type="button" onclick="">

Rafi
sumber
1
Bingo!! Ada yang bisa menjelaskan mengapa ini?
Jorge
3
Secara default jenis tombol HTML adalah 'submit', jadi mengkliknya akan mencoba mengirimkan data formulir. Jadi itu akan menjalankan tindakan klik, kemudian mencoba untuk mengirimkan. Jika Anda menggunakan 'tombol' jenis itu bukan lagi tipe default dan hanya akan bekerja dengan sekali klik.
Christophe Roussy
7

Kode status 0 berarti url yang diminta tidak dapat dijangkau. Dengan mengubah http: // sesuatu / sesuatu menjadi https: // sesuatu / sesuatu berhasil untuk saya. IE melontarkan kesalahan yang mengatakan "izin ditolak" ketika kode status 0, browser lain tidak.

Jagadeesh
sumber
Dalam kasus ini, chrome saat ini akan membiarkan permintaan dalam status "Dihentikan" hingga waktu habis. Ini bisa disebabkan oleh flag Strict-Transport-Security yang dikembalikan dalam permintaan sebelumnya dari server itu, atau bisa juga karena flag Secure / HttpOnly pada cookie yang dikirim bersama permintaan tersebut.
Shane Hughes
7

Penting untuk dicatat, bahwa panggilan ajax bisa gagal bahkan dalam sesi yang ditentukan oleh cookie dengan domain tertentu yang diawali dengan www. Ketika Anda kemudian memanggil script php Anda misalnya tanpa www. awalan di url, panggilan akan gagal dan sebaliknya, juga.

nuxxxx
sumber
4

Artikel ini membantu saya. Saya mengirimkan formulir melalui AJAX dan lupa untuk menggunakan return false(setelah permintaan ajax saya) yang menyebabkan pengiriman formulir klasik tetapi anehnya itu tidak selesai.

Martin Vseticka
sumber
Fajar, aku benci fakta aku tertangkap oleh yang satu ini lagi! <form onsubmit="return false;">berhasil.
Heitor
3

Karena ini muncul ketika Anda google ajax status 0 Saya ingin meninggalkan beberapa tip yang hanya memakan waktu berjam-jam ... Saya menggunakan ajax untuk memanggil layanan PHP yang kebetulan Phil's REST_Controller untuk Codeigniter (tidak yakin apakah ini memiliki ada hubungannya dengan itu atau tidak) dan terus mendapatkan status 0, readystate 0 dan itu membuatku gila. Saya sedang men-debugnya dan memperhatikan ketika saya menggema dan kembali alih-alih keluar dari pesan, saya akan berhasil. Akhirnya saya mematikan debugging dan mencoba dan berhasil. Tampaknya debugger xDebug dengan PHP entah bagaimana memodifikasi responsnya. Jika Anda menggunakan debugger PHP, coba nonaktifkan untuk melihat apakah itu membantu.

michael
sumber
3

Saya menemukan kasus lain di mana jquery memberi Anda kode status 0 - jika karena alasan tertentu XMLHttpRequest tidak ditentukan, Anda akan mendapatkan kesalahan ini.

Jelas ini biasanya tidak akan terjadi di web, tetapi bug dalam build firefox malam menyebabkan ini muncul di add-on yang saya tulis. :)

starwed
sumber
1
Anda benar, saya punya masalah dengan jQuery.ajax()objek XHR. Permintaan itu bahkan tidak dibuat pada panggilan AJAX, masih mendapatkan f.open bukan fungsi dan kode status 0. Disebabkan oleh: Saya mengembalikan $.ajaxSettings.xhrobjek dari $.ajaxSetup({xhr}), mengembalikan new window.XMLHttpRequest();alih-alih menyelesaikan masalah
klimpond
2

Pengiriman formulir "tidak disengaja" adalah masalah yang saya alami. Saya baru saja menghapus tag FORM sama sekali dan itu tampaknya memperbaiki masalah. Terima kasih semuanya!

Insider Pro
sumber
2

Kami memiliki masalah serupa - kode status 0 pada panggilan ajax jquery - dan kami butuh waktu seharian untuk mendiagnosisnya. Karena belum ada yang menyebutkan alasan ini, saya pikir saya akan berbagi.

Dalam kasus kami, masalahnya adalah server HTTP mogok. Beberapa bug di PHP meniup Apache, jadi di akhir klien terlihat seperti ini:

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

di mana test.php berisi kode yang rusak. Tidak ada data yang dikembalikan dari server (bahkan header) => panggilan ajax dibatalkan dengan status 0.

jmper
sumber
2

Dalam kasus saya, ini disebabkan oleh menjalankan server django saya di bawah http://127.0.0.1:8000/tetapi mengirim panggilan ajax ke http://localhost:8000/. Meskipun Anda mengharapkan mereka untuk memetakan ke alamat yang sama, mereka tidak begitu memastikan Anda tidak mengirim permintaan Anda ke localhost.

Vlad Schnakovszki
sumber
2

Dalam kasus kami, link halaman diubah dari https menjadi http . Meskipun pengguna sudah masuk, mereka dicegah memuat dengan AJAX.

Andy Dalam NC
sumber
menarik. Saya berharap ini kasus saya. Karena iframe saya buka dengan https dan pada hasil sukses saya kirim ajax ke http maka saya mendapatkan status 0
sonic
1

Dalam kasus saya, pengaturan url: ''dalam pengaturan ajax akan menghasilkan kode status 0 di ie8 .. Sepertinya ie tidak mentolerir pengaturan seperti itu.

Blurrcat
sumber
1

Bagi saya, masalahnya disebabkan oleh perusahaan hosting (GoDaddy) yang memperlakukan operasi POST yang memiliki data respons substansial (lebih dari puluhan kilobyte) sebagai semacam ancaman keamanan. Jika lebih dari 6 hal ini terjadi dalam satu menit, host menolak untuk mengeksekusi kode PHP yang merespons permintaan POST selama satu menit berikutnya. Saya tidak sepenuhnya yakin apa yang dilakukan oleh host, tetapi saya melihat, dengan tcpdump, paket reset TCP datang sebagai respons terhadap permintaan POST dari browser. Hal ini menyebabkan kode status http yang dikembalikan dalam objek jqXHR menjadi 0.

Mengubah operasi dari POST ke GET memperbaiki masalah. Tidak jelas mengapa GoDaddy memberlakukan batasan ini, tetapi mengubah kode lebih mudah daripada mengubah host.

emrys57
sumber
1

Saya rasa saya tahu apa yang menyebabkan kesalahan ini.

Di google chrome terdapat fitur built-in untuk mencegah serangan ddos ​​untuk ekstensi google chrome.

Ketika permintaan ajax terus menerus mengembalikan 500+ kesalahan status, itu mulai membatasi permintaan.

Oleh karena itu dimungkinkan untuk menerima status 0 pada permintaan berikut.

Anonim
sumber
1

Dalam upaya untuk memenangkan hadiah karena alasan paling bodoh untuk masalah yang dijelaskan.

Lupa menelepon

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

Ya, saya masih mendapatkan pengembalian status nol dari panggilan 'terbuka'.

Gordon Rouse
sumber
1

Dalam kasus saya, saya mendapatkan ini tetapi hanya di Safari Mobile. Masalahnya adalah saya menggunakan URL lengkap ( http://example.com/whatever.php ) daripada yang relatif (terserah.php). Namun ini tidak masuk akal, ini bukan masalah XSS karena situs saya dihosting di http://example.com . Saya kira Safari melihat bagian http dan secara otomatis menandainya sebagai permintaan yang tidak aman tanpa memeriksa sisa URL.

Raúl Bojalil
sumber
1

Dalam pemecahan masalah saya, saya menemukan AJAX xmlhttpRequest.status == 0 ini bisa berarti panggilan klien BELUM mencapai server, tetapi gagal karena masalah di sisi klien. Jika responsnya dari server, maka statusnya harus berupa kode Respons HTTP 1xx / 2xx / 3xx / 4xx / 5xx itu. Untuk selanjutnya, pemecahan masalah harus fokus pada masalah KLIEN, dan mungkin koneksi jaringan internet terputus atau salah satu yang dijelaskan oleh @Langdon di atas.

Panini Luncher
sumber
0

Amati Konsol browser saat membuat permintaan, jika Anda melihat "Kebijakan Asal yang Sama melarang membaca sumber daya jarak jauh di http ajax ..... alasan: header cors 'access-control-allow-origin' hilang" maka Anda perlu tambahkan "Access-Control-Allow-Origin" di header tanggapan. exa: di java Anda dapat menyetel ini seperti response.setHeader ("Access-Control-Allow-Origin", "*") di mana responsnya adalah HttpServletResponse.

Mahadev Mandale
sumber