หมายความว่าอย่างไรเมื่อคำขอ HTTP ส่งคืนรหัสสถานะ 0


130

หมายความว่าอย่างไรเมื่อการเรียกเครือข่าย JavaScript เช่นการดึงข้อมูลหรือ XMLHttpRequest หรือการร้องขอเครือข่าย HTTP ประเภทอื่น ๆ ล้มเหลวด้วยรหัสสถานะ HTTP เป็น 0?

ดูเหมือนจะไม่เป็นรหัสสถานะ HTTP ที่ถูกต้องเนื่องจากรหัสอื่นเป็นตัวเลขสามหลักในข้อกำหนด HTTP

ฉันลองถอดปลั๊กเครือข่ายออกมาเป็นการทดสอบ อาจไม่เกี่ยวข้อง แต่ทำให้รหัสสถานะ 17003 (IIRC) ซึ่งการค้นหาคร่าวๆแนะนำว่าหมายถึง "การค้นหาเซิร์ฟเวอร์ DNS ล้มเหลว"

รหัสเดียวกันทำงานได้ดีจากบางสถานที่และระบบอย่างไรก็ตามในบางสภาพแวดล้อมมันล้มเหลวด้วยรหัสสถานะ 0 และไม่มีการตอบสนองต่อข้อความ

นี่เป็น HTTP POST ทั่วไปสำหรับ URL อินเทอร์เน็ต ไม่เกี่ยวข้องกับไฟล์: // ซึ่งฉันเข้าใจว่าอาจส่งคืน 0 แสดงถึงความสำเร็จใน Firefox


อาจเป็นเพราะไฟร์วอลล์หรือไม่ ไคลเอ็นต์ของคุณใช้ระบบปฏิบัติการประเภทใดอยู่?
shahkalpesh

อาจมีประโยชน์: stackoverflow.com/a/12622082/386579
shasi kanth

โพสต์ที่เกี่ยวข้อง - รหัสสถานะ HTTP 0 หมายถึงอะไร
RBT

ผมเคยมีปัญหาเดียวกันใน Firefox และพบว่ามีการป้องกันการโฆษณาปลั๊กอินป้องกันการร้องขอทั้งหมดไปยัง URL ที่มีคำว่าbanner
ม.ค.

คำตอบ:


56

ฉันเชื่อว่ารหัสข้อผิดพลาดบ่งชี้ว่าการตอบสนองนั้นว่างเปล่า (เนื่องจากไม่มีการส่งคืนส่วนหัว) ซึ่งหมายความว่าการเชื่อมต่อได้รับการยอมรับและปิดอย่างเรียบร้อย (TCP FIN) มีหลายสิ่งที่อาจทำให้เกิดสิ่งนี้ แต่จากคำอธิบายของคุณไฟร์วอลล์บางรูปแบบดูเหมือนจะเป็นผู้ร้าย


2
ฉันคิดว่าคุณพูดถูก (ถึงแม้ว่าจะเป็นออกแหลมโดย @sleepycod จะคาดว่าจะกลับมา Wininet.dll รหัสสถานะบางอย่างในกรณีที่ไม่มีที่จริงรหัสสถานะ http.)
ไมค์เนลสัน

1
สิ่งนี้ไม่ถูกต้อง ฉันมีปัญหาเดียวกัน แต่ในกรณีของฉันคำขอไม่เคยถูกส่ง เหตุผลก็คือตัวป้องกันโฆษณาของ Firefox ป้องกันคำขอที่มี URL ที่มีคำว่าbanner
Jan

194

คำตอบมากมายที่นี่ผิด ดูเหมือนว่าผู้คนจะคิดออกว่าอะไรเป็นสาเหตุของสถานะ == 0 ในกรณีเฉพาะของพวกเขาแล้วพูดคุยกันทั่วไปว่าเป็นคำตอบ

การพูดจริงสถานะ == 0 สำหรับ XmlHttpRequest ที่ล้มเหลวควรถูกพิจารณาว่าเป็นข้อผิดพลาดที่ไม่ได้กำหนด

ข้อมูลจำเพาะ W3C จริงจะกำหนดเงื่อนไขที่จะส่งกลับค่าศูนย์ที่นี่: https://fetch.spec.whatwg.org/#concept-network-error

อย่างที่คุณเห็นจากสเป็ค (fetch หรือ XmlHttpRequest) รหัสนี้อาจเป็นผลมาจากข้อผิดพลาดที่เกิดขึ้นก่อนที่จะมีการติดต่อกับเซิร์ฟเวอร์

สถานการณ์ทั่วไปบางอย่างที่สร้างรหัสสถานะนี้จะสะท้อนให้เห็นในคำตอบอื่น ๆ แต่อาจเป็นปัญหาใด ๆ หรือไม่มีเลย:

  1. คำขอข้ามที่ผิดกฎหมาย (ดูCORS )
  2. บล็อกไฟร์วอลล์หรือการกรอง
  3. คำขอถูกยกเลิกด้วยรหัส
  4. ส่วนขยายเบราว์เซอร์ที่ติดตั้งกำลังสร้างความวุ่นวาย

สิ่งที่จะเป็นประโยชน์สำหรับเบราว์เซอร์เพื่อให้การรายงานข้อผิดพลาดโดยละเอียดสำหรับสถานะเพิ่มเติมเหล่านี้ == 0 สถานการณ์ อันที่จริงบางครั้งสถานะ == 0 จะมาพร้อมกับข้อความคอนโซลที่เป็นประโยชน์ แต่ในอื่น ๆ ไม่มีข้อมูลอื่น


4
Firefox addon NoScript สามารถยกเลิกการร้องขอ XHR ไปยังโฮสต์ที่ไม่น่าเชื่อถือ
Ivan Solntsev

5
+ 1 ทั้งหมดนี้ถูกต้องและ "ข้อผิดพลาดบางประเภทเกิดขึ้น" คือการตีความที่ใช้งานได้จริง สำหรับผู้ที่สนใจในรายการที่ครอบคลุมของสาเหตุที่เป็นไปได้รับจากสเปคที่ผมได้โพสต์รายละเอียดที่stackoverflow.com/a/26451773/1709587
Mark Amery

1
ในบรรดากรณีที่มีรายละเอียดโดย Mark Amery ที่ทำให้ฉันมีปัญหามากที่สุดคือคดี cors หากข้อผิดพลาดทำให้การตอบสนองล้มเหลวในการตรวจสอบความถูกต้องของ cors คุณจะได้รับสถานะ 0 แทนสถานะ http เนื่องจากเมื่อการตรวจสอบความถูกต้องของ cors ล้มเหลวการตอบกลับจะไม่สามารถเข้าถึงได้ น่าผิดหวังเป็นพิเศษเมื่อพยายามตรวจหา web api ที่กำลังบำรุงรักษาและตอบสนอง 503 ถ้า api นี้ไม่ให้เกียรติ cors ในระหว่างการบำรุงรักษาคุณจะไม่สามารถตรวจพบ 503 คุณจะได้รับ 0 ซึ่งอาจเกิดจากคนอื่น ๆ สิ่ง
Frédéric

ฉันต้องเผชิญกับปัญหา CORS: ลองใช้httpแทนhttpsหากหน้าเว็บของคุณถูกโหลดครั้งแรกhttpและในทางกลับกัน คำอีกไม่ได้ดำเนินการอาแจ็กซ์POSTผ่านhttpsหากหน้าของคุณถูกเข้าถึงได้ผ่านทางhttpและไม่ได้ดำเนินการอาแจ็กซ์POSTผ่านหากหน้าของคุณถูกเข้าถึงผ่านทางhttp initiallly https
Victor Ponamarev

คำขอแบบซิงโครนัสส่งข้อยกเว้นที่มีความหมายมากขึ้นในสถานะ 0 รายการ: stackoverflow.com/a/49573256/1192811
McX

35

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

ไม่ใช่เทคโนโลยีเดียวกับที่คุณใช้ แต่หวังว่าจะมีประโยชน์กับใครบางคน


ใช่ผู้คนอาจได้รับปัญหามากเนื่องจากหน้านี้มี 10,000 ครั้ง
ไมค์เนลสัน

หรือฉันควรพูด 25,000 ครั้ง?
ไมค์เนลสัน

3
มันมีค่ามาก: มันเป็นสิ่งที่ผิดพลาดในการทดสอบอัตโนมัติของฉัน ขอบคุณมาก!
alexfernandez

โหวตขึ้นไม่ได้เพราะนี่คือคำตอบที่ "ถูก" แต่มันเป็นสิ่งที่เกิดขึ้นในกรณีของฉัน
Juan Mendes

สิ่งนี้จะเกิดขึ้นอย่างแน่นอน แต่ไม่ใช่เหตุผลเดียวที่คุณจะเห็นรหัสข้อผิดพลาด == 0 คุณไม่สามารถสันนิษฐานได้ว่าเป็นเพียงผู้ใช้ที่ออกไปแล้วจึงกรองข้อความแสดงข้อผิดพลาดประเภทนี้ออกไป
wal

14

wininet.dll ส่งคืนทั้งรหัสสถานะมาตรฐานและที่ไม่ได้มาตรฐานซึ่งแสดงอยู่ด้านล่าง

401 - Unauthorized file
403 - Forbidden file
404 - File Not Found
500 - some inclusion or functions may missed
200 - Completed

12002 - Server timeout
12029,12030, 12031 - dropped connections (either web server or DB server)
12152 - Connection closed by server.
13030 - StatusText properties are unavailable, and a query attempt throws an exception

สำหรับรหัสสถานะ "ศูนย์" คุณพยายามทำคำขอบนหน้าเว็บท้องถิ่นที่ทำงานบนเว็บเซิร์ฟเวอร์หรือไม่ใช้เว็บเซิร์ฟเวอร์?

XMLHttpRequest status = 0 และ XMLHttpRequest statusText = unknownสามารถช่วยคุณได้หากคุณไม่ได้เรียกใช้สคริปต์ของคุณบนเว็บเซิร์ฟเวอร์


ขอบคุณสำหรับรหัส ไม่ไม่ใช่คำขอในท้องถิ่นเป็นคำขอไปยังเว็บเซิร์ฟเวอร์บนอินเทอร์เน็ตจาก vbscript ที่ใช้งานอยู่ในเครื่อง
ไมค์เนลสัน

6

วิธีแก้ปัญหา: สิ่งที่เราทำลงเอย

เราคิดว่ามันเกี่ยวข้องกับปัญหาของไฟร์วอลล์ดังนั้นเราจึงหาวิธีการแก้ปัญหาที่ไม่สามารถทำได้ หากใครมีปัญหาเดียวกันนี้นี่คือสิ่งที่เราทำ:

  1. เรายังคงเขียนข้อมูลไปยังไฟล์ข้อความบนฮาร์ดดิสก์ภายในอย่างที่เราเคยทำโดยใช้ HTA

  2. เมื่อผู้ใช้คลิก "ส่งข้อมูลกลับไปที่เซิร์ฟเวอร์" HTA จะอ่านข้อมูลและเขียนหน้า HTML ที่มีข้อมูลนั้นเป็นเกาะข้อมูล XML (โดยใช้บล็อกสคริปต์ SCRIPT LANGUAGE = XML)

  3. HTA เรียกใช้ลิงก์ไปยังหน้า HTML ในเบราว์เซอร์

  4. ตอนนี้หน้า HTML มีจาวาสคริปต์ที่โพสต์ข้อมูลไปยังเซิร์ฟเวอร์ (ใช้ Microsoft.XMLHTTP)

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


สวัสดีฉันกำลังตรวจสอบปัญหาที่คล้ายกันที่เกิดขึ้นกับลูกค้าในการผลิต คุณพูดว่าปัญหาเกิดจากไฟร์วอลล์ คุณจำสิ่งที่เกิดขึ้นจากไฟร์วอลล์หรือไฟร์วอลล์ทำอะไรเพื่อทำให้เกิดสิ่งนี้
Ibrahim Najjar

5

รหัสตอบกลับ HTTP เป็น 0 ระบุว่าคำขอ AJAX ถูกยกเลิก

สิ่งนี้สามารถเกิดขึ้นได้จากการหมดเวลาการทำแท้ง XHR หรือไฟร์วอลล์ที่กระทืบตามคำขอ การหมดเวลาเป็นเรื่องปกติหมายความว่าคำขอล้มเหลวในการดำเนินการภายในเวลาที่กำหนด การทำแท้ง XHR ทำได้ง่ายมาก ... คุณสามารถเรียก .abort () บนวัตถุ XMLHttpRequest เพื่อยกเลิกการเรียก AJAX ( นี่เป็นวิธีปฏิบัติที่ดีสำหรับแอปพลิเคชันหน้าเดียวหากคุณไม่ต้องการให้ AJAX โทรกลับและพยายามอ้างอิงวัตถุที่ถูกทำลาย ) ตามที่ระบุไว้ในคำตอบที่ทำเครื่องหมายไว้ไฟร์วอลล์จะสามารถยกเลิกการร้องขอและทริกเกอร์สิ่งนี้ได้ 0 คำตอบ

XHR Abort: ยกเลิกคำขอ Ajax โดยใช้ jQuery

var xhr = $.ajax({
    type: "POST",
    url: "some.php",
    data: "name=John&location=Boston",
    success: function(msg){
       alert( "Data Saved: " + msg );
    }
});

//kill the request
xhr.abort()

เป็นที่น่าสังเกตว่าการรันเมธอด .abort () บนวัตถุ XHR จะทำให้เกิดข้อผิดพลาดในการเรียกกลับ หากคุณทำการจัดการข้อผิดพลาดใด ๆ ที่แยกวิเคราะห์วัตถุเหล่านี้คุณจะสังเกตเห็นได้อย่างรวดเร็วว่า XHR ที่ถูกยกเลิกและหมดเวลา XHR เหมือนกัน แต่ด้วย jQuery textStatus ที่ส่งผ่านไปยังการเรียกกลับข้อผิดพลาดจะเป็น "ยกเลิก" เมื่อถูกยกเลิก และ "หมดเวลา" กับการหมดเวลาเกิดขึ้น หากคุณใช้ Zepto (คล้ายกันมากกับ jQuery) errorType จะเป็น "ข้อผิดพลาด" เมื่อถูกยกเลิกและ "หมดเวลา" เมื่อการหมดเวลาเกิดขึ้น

jQuery: error(jqXHR, textStatus, errorThrown);
Zepto:  error(xhr, errorType, error);

4

ตามรายละเอียดโดยคำตอบนี้ในหน้านี้รหัสสถานะ 0 หมายถึงคำขอล้มเหลวด้วยเหตุผลบางประการและห้องสมุดจาวาสคริปต์ตีความว่าล้มเหลวเป็นรหัสสถานะ 0

ในการทดสอบคุณสามารถทำอย่างใดอย่างหนึ่งต่อไปนี้:

1) ใช้ส่วนขยายของโครเมี่ยมนี้อย่างจริงจังเพื่อเปลี่ยน URL ของคุณจากhttpsเวอร์ชันของ URL ไปยังhttpรุ่นเนื่องจากจะทำให้เกิดข้อผิดพลาดด้านความปลอดภัยของเนื้อหาแบบผสมและในที่สุดก็สร้างรหัสสถานะเป็น 0 ข้อดีของวิธีนี้คือ ไม่ต้องเปลี่ยนแอปเลยและคุณสามารถ "เขียน" url ของคุณใหม่โดยใช้ส่วนขยายนี้

2) เปลี่ยนรหัสแอปของคุณเป็นทางเลือกให้ปลายทางเปลี่ยนเป็นhttpURL ของคุณแทนที่จะเป็นhttpsเวอร์ชั่น (หรือกลับกัน) หากคุณทำสิ่งนี้คำขอจะล้มเหลวด้วยรหัสสถานะ 0


1
"ใช้ส่วนขยายของโครเมี่ยมนี้" - ส่วนขยายของโครเมี่ยม? ในแอปพลิเคชัน HTA หรือไม่
เควนติน

4
จุดที่ดีแน่นอน! แต่คนส่วนใหญ่ที่มาที่นี่ไม่ได้มาที่นี่สำหรับแอปพลิเคชัน HTA พวกเขากำลัง googling "javascript http รหัสสถานะ 0" หรืออะไรทำนองนั้นและมาถึงที่นี่ - ดังนั้นฉันคิดว่าส่วน HTA ของคำถามนี้มีความสำคัญน้อยที่สุดโดยรวมและท้ายที่สุดนี้ยังเกี่ยวข้อง
Brad Parks

2

ในกรณีของฉันสถานะกลายเป็น 0 เมื่อฉันจะลืมใส่ WWW ต่อหน้าโดเมนของฉัน เนื่องจากคำขอ ajax ทั้งหมดของฉันเป็น http: /WWW.mydomain.com ที่ฮาร์ดโค้ดและหน้าเว็บที่โหลดจะเป็นhttp://mydomain.com เท่านั้นจึงกลายเป็นปัญหาด้านความปลอดภัยเนื่องจากเป็นโดเมนที่ต่างกัน ฉันสิ้นสุดการเปลี่ยนเส้นทางในไฟล์. htaccess เพื่อใส่ www ไว้ด้านหน้าเสมอ


1

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

อย่างไรก็ตามสาเหตุที่แท้จริงคือ<base>แท็กที่ดูไร้เดียงสา:

<base href='<%=request.getScheme()%>://<%=request.getServerName() + ":" + request.getServerPort() + request.getContextPath()%>/'/>

ฉันลบ<base>แท็กที่ฉันไม่ต้องการใช้ไปและตอนนี้ก็ใช้ได้ดี!


1

ฉันพบเหตุผลใหม่และที่ไม่มีเอกสารสำหรับสถานะ == 0 นี่คือสิ่งที่ฉันมี:

XMLHttpRequest.status === 0
XMLHttpRequest.readyState === 0
XMLHttpRequest.responseText === ''
XMLHttpRequest.state() === 'rejected'

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

ฉันสามารถหาเอกสารน้อยมากเกี่ยวกับ state () (Mozilla ไม่แสดงรายการ W3C ไม่) และไม่มีการกล่าวถึง "ปฏิเสธ"

กลับกลายเป็นว่าตัวบล็อกโฆษณาของฉัน(uBlock Origin บน Firefox)


1

นอกเหนือจากคำตอบของ Leeคุณอาจพบข้อมูลเพิ่มเติมเกี่ยวกับสาเหตุที่แท้จริงด้วยการสลับไปยังคำขอแบบซิงโครนัสเนื่องจากคุณจะได้รับข้อยกเว้นด้วย:

function request(url) {
    var request = new XMLHttpRequest();
    try {
        request.open('GET', url, false);
        request.send(null);
    } catch (e) {
        console.log(url + ': ' + e);
    }
}

ตัวอย่างเช่น :

NetworkError: เกิดข้อผิดพลาดเครือข่าย


0

ในกรณีที่มีคนอื่นเจอปัญหานี้สิ่งนี้ทำให้ฉันมีปัญหาเนื่องจากคำขอ AJAX และส่งแบบฟอร์มปกติ ฉันแก้ไขด้วยบรรทัดต่อไปนี้:

<form onsubmit="submitfunc(); return false;">

คีย์มีการคืนค่าเท็จซึ่งทำให้ฟอร์มไม่ส่ง คุณสามารถเพียงแค่คืนค่าเท็จจากภายใน submitfunc () แต่ฉันพบว่าการเขียนให้ชัดเจนยิ่งขึ้น


1
ป้องกันการเริ่มต้นทำงานสำหรับสิ่งนี้เช่นกัน มันเป็นฟังก์ชั่นจาวาสคริปต์ที่ป้องกันไม่ให้เบราว์เซอร์ดำเนินการพฤติกรรมเริ่มต้นในระหว่างเหตุการณ์ช่วยให้คุณสามารถแทนที่ / ป้องกันฟังก์ชั่นดั้งเดิมได้อย่างเรียบร้อย ... การคืนค่าเท็จก็เป็นสิ่งเดียวกัน
คอรีแดเนียล

0

ควรสังเกตว่าการอัปโหลดไฟล์ ajax เกินclient_max_body_sizeคำสั่งสำหรับ nginx จะส่งคืนรหัสข้อผิดพลาดนี้


0

หากคุณกำลังทดสอบบนพีซีในระบบมันจะไม่ทำงาน ในการทดสอบตัวอย่าง Ajax คุณต้องวางไฟล์ HTML บนเว็บเซิร์ฟเวอร์


0

ในกรณีของฉันข้อผิดพลาดเกิดขึ้นในหน้าเว็บที่ร้องขอด้วยโปรโตคอล HTTP โดยมี Javascript อยู่ภายในซึ่งพยายามทำการร้องขอ HTTPS และในทางกลับกัน.

หลังจากโหลดหน้าเว็บแล้วให้กด F12 (หรือ Ctrl + U) แล้วดูที่รหัส HTML ของหน้าเว็บของคุณ หากคุณเห็นบางอย่างเช่นนั้นในรหัสของคุณ:

<!-- javascript request inside the page -->
<script>
var ajaxurl = "https://example.com/wp-admin/admin-ajax.php";
(...)
</script>

และหน้าของคุณได้รับการร้องขอด้วยวิธีนี้:

http://example.com/example-page/2019/09/13/my-post/#elf_l1_Lw

คุณจะต้องเผชิญกับข้อผิดพลาดนี้อย่างแน่นอน

หากต้องการแก้ไขให้ตั้งค่าโปรโตคอลของคำขอ Javascript เท่ากับโปรโตคอลของคำขอหน้าเว็บ

สถานการณ์นี้เกี่ยวข้องกับโปรโตคอลที่แตกต่างกันสำหรับหน้าและคำขอ js ถูกกล่าวถึงก่อนหน้านี้ในคำตอบของBrad Parksแต่ฉันเดาว่าเทคนิคการวินิจฉัยที่นำเสนอที่นี่เป็นเรื่องง่ายสำหรับผู้ใช้ส่วนใหญ่

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