เพราะเหตุใด AJAX จึงส่งคืนรหัสสถานะ HTTP 0


139

ด้วยเหตุผลบางอย่างในขณะที่ใช้ AJAX (กับฉัน แอพลิเคชันที่พัฒนาแล้ว) 0เบราว์เซอร์เพียงแค่หยุดการอัปโหลดและผลตอบแทนของรหัสสถานะ ทำไมสิ่งนี้ถึงเกิดขึ้น

คำตอบ:


110

อีกกรณีหนึ่ง:

มันอาจจะเป็นไปได้ที่จะได้รับรหัสสถานะของ0ถ้าคุณได้ส่งโทร AJAX และการฟื้นฟูของเบราว์เซอร์ถูกเรียกก่อนที่จะได้รับการตอบสนอง การโทร AJAX จะถูกยกเลิกและคุณจะได้รับสถานะนี้


9
ขอบคุณสำหรับการชี้ให้เห็นมันทำให้ฉันตระหนักว่า (เช่นเดียวกับการรีเฟรชเบราว์เซอร์) การส่งแบบฟอร์มสามารถยกเลิกการโทร ajax
Magnus Smith

1
เพิ่งทำ<form onsubmit="return false;">
Heitor

1
@ ข้อเสนอแนะของ Heitor ใช้งานได้สำหรับฉัน - ปุ่ม "ส่ง" ของแบบฟอร์มกำลังรีเฟรชหน้าเว็บในขณะเดียวกันฉันมีจาวาสคริปต์ที่พยายามเรียกใช้ ajax เมื่อคลิกปุ่ม "ส่ง" ผลลัพธ์คือการโทร ajax ถูกยกเลิก
Nic Scozzaro

เฮ้ฉันพลาดe.preventDefault();
SparK

97

จากประสบการณ์ของฉันคุณจะเห็นสถานะเป็น 0 เมื่อ:

  • กำลังทำสคริปต์ข้ามไซต์ (ที่ถูกปฏิเสธการเข้าถึง)
  • ขอ URL ที่ไม่สามารถเข้าถึงได้ (พิมพ์ผิดปัญหา DNS ฯลฯ )
  • คำขอถูกขัดขวางเป็นอย่างอื่น (ตรวจสอบตัวบล็อกโฆษณาของคุณ)
  • ดังกล่าวข้างต้นหากคำขอถูกขัดจังหวะ (เบราว์เซอร์นำทางออกจากหน้า)

1
ฉันได้รับเมื่อการเชื่อมต่อถูกปฏิเสธ ตัวอย่างเช่นเมื่อทำการดีบั๊กไซต์ของฉันด้วย Visual Studio ถ้าฉันหยุดเซสชันการดีบักคำขอใด ๆ ที่พยายามเชื่อมต่อจะได้รับ net :: ERR_CONNECTION_REFUSED และรหัสสถานะจะเป็นศูนย์ มันสมเหตุสมผลแล้วเนื่องจากคุณไม่มีรหัสสถานะหากคุณไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์ที่ควรให้รหัสนั้น
Triynko

ฉันสามารถยืนยัน ฉันมีสถานะ == 0 หลังจากปิดเว็บเซิร์ฟเวอร์
9ilsdx 9rvj 0lo

ฉันมีข้อผิดพลาดเนื่องจาก 'สคริปต์ข้ามไซต์'; ฉันควรทำอย่างไรดี?

1
@nasimjahednia ค้นหา CORS ... เซิร์ฟเวอร์ที่คุณพยายามเข้าถึงจำเป็นต้องอนุญาตให้มีสคริปต์ข้ามไซต์จากโดเมนของคุณ
Langdon

ฉันสับสน ไม่มีวิธีรับรหัสข้อผิดพลาด HTTP ที่ส่งคืนหรือไม่ นี่เป็นกรณีต่าง ๆ มากมายที่นี่ (415, 404, ฯลฯ ?)
Edwin Evans

8

<button onclick="">submit</button>ปัญหาเดียวกันที่นี่เมื่อใช้ แก้ไขแล้วโดยใช้<input type="button" onclick="">


1
บิงโก !! ทุกคนสามารถอธิบายได้ว่าทำไมถึงเป็นเช่นนี้?
Jorge

3
โดยค่าเริ่มต้นประเภทปุ่ม HTML คือ 'ส่ง' ดังนั้นการคลิกมันจะพยายามส่งข้อมูลแบบฟอร์ม ดังนั้นจะดำเนินการคลิกแล้วลองส่ง หากคุณใช้ 'ปุ่ม' ประเภทนี้จะไม่เป็นประเภทเริ่มต้นอีกต่อไปและจะทำงานเฉพาะบนคลิก
Christophe Roussy

7

รหัสสถานะ 0 หมายความว่าไม่สามารถเข้าถึง URL ที่ร้องขอได้ โดยการเปลี่ยนhttp: // something / somethingเป็นhttps: // something / somethingทำงานได้สำหรับฉัน IE โยนข้อผิดพลาดว่า "การอนุญาตถูกปฏิเสธ" เมื่อรหัสสถานะเป็น 0 เบราว์เซอร์อื่นไม่


ในกรณีนี้ Chrome จะออกจากคำขอในสถานะ "Stalled" จนกว่าจะหมดเวลา อาจเกิดจากการตั้งค่าสถานะStrict-Transport-Security ที่ส่งคืนในคำขอก่อนหน้าจากเซิร์ฟเวอร์นั้นหรืออาจเป็นสถานะSecure / HttpOnlyบนคุกกี้ที่ถูกส่งไปพร้อมกับคำขอ
เชนฮิวจ์

7

สิ่งสำคัญคือต้องทราบว่าการโทร ajax อาจล้มเหลวแม้จะอยู่ในเซสชันที่กำหนดโดยคุกกี้ที่มีโดเมนนำหน้าด้วย www เมื่อคุณโทรสคริปต์ php ของคุณเช่นไม่มี www คำนำหน้าใน url การโทรจะล้มเหลวและ viceversa เช่นกัน


4

บทความนี้ช่วยฉัน ฉันกำลังส่งแบบฟอร์มผ่าน AJAX และลืมที่จะใช้return false(หลังจากคำขอ ajax ของฉัน) ซึ่งนำไปสู่การส่งแบบฟอร์มคลาสสิก แต่ก็แปลกที่มันไม่สมบูรณ์


รุ่งอรุณฉันเกลียดความจริงที่ฉันถูกจับโดยอันนี้อีกครั้ง! <form onsubmit="return false;">ทำเคล็ดลับ
Heitor

3

เพราะสิ่งนี้จะปรากฏขึ้นเมื่อคุณ google ajax สถานะ 0 ฉันต้องการที่จะออกเคล็ดลับที่ใช้เวลาหลายชั่วโมงฉันเสียเวลา ... ฉันใช้ ajax เพื่อโทรหาบริการ PHP ที่เกิดขึ้นเป็น REST_Controller ของ Phil สำหรับ 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 ทั้งหมดและดูเหมือนว่าจะแก้ไขปัญหาได้ ขอบคุณทุกคน!


2

เรามีปัญหาที่คล้ายกัน - รหัสสถานะ 0 ใน jquery ajax call - และเราใช้เวลาทั้งวันในการวินิจฉัย เนื่องจากยังไม่มีใครพูดถึงเหตุผลนี้ฉันคิดว่าฉันจะแบ่งปัน

ในกรณีของเราปัญหาเซิร์ฟเวอร์ 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/whething.php ) แทนที่จะเป็นแบบสัมพัทธ์ (what.php) นี้ไม่ได้ทำให้รู้สึกใด ๆ แต่ก็ไม่สามารถจะเป็นปัญหา XSS เพราะเว็บไซต์ของฉันจะเป็นเจ้าภาพที่http://example.com ฉันเดาว่า Safari ดูที่ส่วน http และตั้งค่าสถานะโดยอัตโนมัติว่าเป็นคำขอที่ไม่ปลอดภัยโดยไม่ตรวจสอบส่วนที่เหลือของ URL


1

ในการแก้ไขปัญหาของฉันฉันพบ AJAX xmlhttpRequest.status == 0 อาจหมายความว่าการโทรของลูกค้ายังไม่ถึงเซิร์ฟเวอร์ แต่ล้มเหลวเนื่องจากปัญหาทางฝั่งไคลเอ็นต์ หากการตอบสนองมาจากเซิร์ฟเวอร์ดังนั้นสถานะจะต้องเป็นรหัสการตอบกลับ HTTP 1xx / 2xx / 3xx / 4xx / 5xx ต่อจากนี้ไปการแก้ไขปัญหาจะมุ่งเน้นไปที่ปัญหาของลูกค้าและอาจเป็นการเชื่อมต่อเครือข่ายอินเทอร์เน็ตหรือหนึ่งในนั้นที่ @Langdon อธิบายไว้ข้างต้น


0

สังเกตคอนโซลของเบราว์เซอร์ในขณะที่ทำคำขอหากคุณเห็น "นโยบายกำเนิดเดียวกันไม่อนุญาตให้อ่านทรัพยากรระยะไกลที่ http ajax ..... เหตุผล: cors header 'access-control-allow-origin' หายไป" คุณต้อง เพิ่ม "Access-Control-Allow-Origin" ในหัวข้อการตอบสนอง exa: ใน java คุณสามารถตั้งค่านี้ได้เช่น response.setHeader ("Access-Control-Allow-Origin", "*") โดยการตอบสนองคือ HttpServletResponse

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.