Điều đó có nghĩa là gì khi một yêu cầu HTTP trả về mã trạng thái 0?


130

Điều đó có nghĩa là gì khi các cuộc gọi mạng JavaScript như tìm nạp hoặc XMLHttpRequest hoặc bất kỳ loại yêu cầu mạng HTTP nào khác, không thành công với mã trạng thái HTTP là 0?

Đây dường như không phải là mã trạng thái HTTP hợp lệ vì các mã khác có ba chữ số trong đặc tả HTTP.

Tôi đã thử rút mạng hoàn toàn như một bài kiểm tra. Nó có thể không liên quan, nhưng điều đó dẫn đến mã trạng thái 17003 (IIRC), mà tìm kiếm chữ thảo gợi ý có nghĩa là "tra cứu máy chủ DNS không thành công".

Mã tương tự hoạt động tốt từ một số vị trí và hệ thống, tuy nhiên trong một số môi trường nhất định, nó không thành công với mã trạng thái 0 và không có phản hồi được cung cấp.

Đây là một HTTP POST điển hình cho một URL Internet. Nó không liên quan đến tệp: // mà tôi hiểu có thể trả về 0 cho thấy thành công trong Firefox.


Nó có thể là do tường lửa? Hệ điều hành nào là ứng dụng khách của bạn chạy ứng dụng trên?
shahkalpesh



Tôi đã gặp vấn đề tương tự trong Firefox và phát hiện ra rằng plugin chặn quảng cáo sẽ ngăn tất cả các yêu cầu tới các URL có chứa từ đóbanner
ngày

Câu trả lời:


56

Tôi tin rằng mã lỗi chỉ ra rằng phản hồi trống, (vì thậm chí không có tiêu đề nào được trả về). Điều này có nghĩa là kết nối đã được chấp nhận và sau đó đóng lại một cách duyên dáng (TCP FIN). Có một số điều có thể gây ra điều này, nhưng dựa trên mô tả của bạn, một số dạng tường lửa dường như là thủ phạm có khả năng nhất.


2
Tôi nghĩ rằng bạn có thể đúng. (Mặc dù, như được chỉ ra bởi @s ngủycod wininet.dll sẽ được trả lại một số mã trạng thái nếu không có mã trạng thái http thực .)
mike nelson

1
Điều này không nhất thiết đúng. Tôi đã có cùng một vấn đề, nhưng trong trường hợp của tôi, một yêu cầu không bao giờ được gửi. Lý do là vì trình chặn quảng cáo Firefox đã ngăn các yêu cầu có URL chứa từ đóbanner
ngày

194

Nhiều câu trả lời ở đây là sai. Có vẻ như mọi người tìm ra nguyên nhân gây ra tình trạng == 0 trong trường hợp cụ thể của họ và sau đó khái quát đó là câu trả lời.

Thực tế mà nói, trạng thái == 0 đối với XmlHttpRequest không thành công nên được coi là lỗi không xác định.

Thông số W3C thực tế xác định các điều kiện mà số 0 được trả về tại đây: https://fetch.spec.whatwg.org/#concept-network-error

Như bạn có thể thấy từ thông số kỹ thuật (tìm nạp hoặc XmlHttpRequest) mã này có thể là kết quả của một lỗi xảy ra ngay cả trước khi máy chủ được liên hệ.

Một số tình huống phổ biến tạo ra mã trạng thái này được phản ánh trong các câu trả lời khác nhưng nó có thể là bất kỳ hoặc không có vấn đề nào sau đây:

  1. Yêu cầu nguồn gốc chéo bất hợp pháp (xem CORS )
  2. Tường lửa chặn hoặc lọc
  3. Yêu cầu đã bị hủy trong mã
  4. Một phần mở rộng trình duyệt được cài đặt đang làm hỏng mọi thứ

Điều hữu ích sẽ là các trình duyệt cung cấp báo cáo lỗi chi tiết cho nhiều tình huống == 0 kịch bản này. Thật vậy, đôi khi trạng thái == 0 sẽ đi kèm với một thông báo bảng điều khiển hữu ích, nhưng trong những người khác không có thông tin nào khác.


4
Addon Firefox NoScript có thể hủy yêu cầu XHR đến các máy chủ không tin cậy.
Ivan Solntsev

5
+ 1, đây là tất cả chính xác và "một số loại lỗi xảy ra" là giải thích thực tế. Đối với những người quan tâm đến một danh sách đầy đủ các nguyên nhân có thể được đưa ra bởi thông số kỹ thuật, tôi đã đăng một sự cố tại stackoverflow.com/a/26451773/1709587 .
Đánh dấu Amery

1
Trong số các trường hợp chi tiết của Mark Amery gây rắc rối cho tôi nhất là trường hợp cors. Nếu lỗi gây ra phản hồi không thành công xác thực bằng cách này, bạn sẽ nhận được trạng thái 0 thay vì trạng thái http, vì khi xác thực cors thất bại, không thể truy cập phản hồi. Đặc biệt bực bội khi cố gắng phát hiện một api web đang bảo trì và phản hồi 503. Nếu api này không tôn trọng các cors trong khi bảo trì, bạn sẽ không thể phát hiện ra 503, bạn sẽ chỉ nhận được 0, có thể do rất nhiều người khác gây ra nhiều thứ.
Frédéric

Vấn đề CORS tôi gặp phải: cân nhắc sử dụng httpthay vì httpsnếu trang của bạn ban đầu được tải qua httpvà ngược lại. Một từ khác không thực hiện ajax POSTthông qua httpsnếu trang của bạn được truy cập qua httpvà không thực hiện ajax POSTthông qua httpnếu trang của bạn được truy cập ngay lập tức thông qua https.
Victor Ponamarev 6/03/2016

Các yêu cầu đồng bộ đưa ra một ngoại lệ có ý nghĩa hơn đối với trạng thái 0: stackoverflow.com/a/49573256/1192811
McX

35

Đối với giá trị của nó, tùy thuộc vào trình duyệt, các cuộc gọi AJAX dựa trên jQuery sẽ gọi lại cuộc gọi thành công của bạn với mã trạng thái HTTP là 0. Chúng tôi đã tìm thấy mã trạng thái "0" thường có nghĩa là người dùng đã điều hướng đến một trang khác trước đó cuộc gọi AJAX đã hoàn thành.

Không phải là ngăn xếp công nghệ giống như bạn đang sử dụng, nhưng hy vọng sẽ hữu ích cho ai đó.


Vâng, mọi người có thể nhận được vấn đề đó rất nhiều, vì trang này đã có 10.000 lượt xem.
mike nelson

Hay tôi nên nói 25.000 lượt xem?
mike nelson

3
Nó có giá trị rất nhiều: đó chính xác là những gì đã làm sai trong các bài kiểm tra tự động của tôi. Cảm ơn rất nhiều!
alexfernandez

Không được ủng hộ vì đây là "câu trả lời" đúng, nhưng đó là những gì đã xảy ra trong trường hợp của tôi.
Juan Mendes

Điều này chắc chắn xảy ra nhưng đó không phải là lý do duy nhất bạn sẽ thấy mã lỗi == 0. bạn không thể cho rằng đó chỉ là người dùng điều hướng đi và do đó lọc ra các thông báo lỗi thuộc loại này.
wal

14

wininet.dll trả về cả mã trạng thái tiêu chuẩn và không chuẩn được liệt kê bên dưới.

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

Đối với mã trạng thái "không", bạn đang cố gắng thực hiện một yêu cầu trên trang web cục bộ chạy trên máy chủ web hay không có máy chủ web?

XMLHttpRequest status = 0 và XMLHttpRequest statusText = unknown có thể giúp bạn nếu bạn không chạy tập lệnh của mình trên máy chủ web.


Cảm ơn các mã. Không, nó không phải là một yêu cầu cục bộ, nó là một yêu cầu đến một máy chủ web trên internet, từ một vbscript chạy cục bộ.
mike nelson

6

Cách giải quyết: những gì chúng ta đã làm

Chúng tôi đã tìm ra nó là để làm với các vấn đề tường lửa, và vì vậy chúng tôi đã đưa ra một cách giải quyết mà đã lừa. Nếu bất cứ ai có vấn đề tương tự, đây là những gì chúng tôi đã làm:

  1. Chúng tôi vẫn ghi dữ liệu vào một tệp văn bản trên đĩa cứng cục bộ như trước đây, bằng cách sử dụng HTA.

  2. Khi người dùng nhấp vào "gửi dữ liệu trở lại máy chủ", HTA sẽ đọc dữ liệu và viết ra một trang HTML bao gồm dữ liệu đó dưới dạng đảo dữ liệu XML (thực tế sử dụng khối tập lệnh SCRIPT LANGUAGE = XML).

  3. HTA khởi chạy một liên kết đến trang HTML trong trình duyệt.

  4. Trang HTML hiện chứa javascript đăng dữ liệu lên máy chủ (sử dụng Microsoft.XMLHTTP).

Hy vọng điều này sẽ giúp bất cứ ai có một yêu cầu tương tự. Trong trường hợp này, đó là một trò chơi Flash được sử dụng trên máy tính xách tay tại các hội chợ. Chúng tôi không bao giờ có quyền truy cập vào máy tính xách tay và chỉ có thể gửi email cho khách hàng vì hội chợ này đang diễn ra ở một quốc gia khác.


Xin chào Tôi đang điều tra một vấn đề tương tự đang xảy ra với một khách hàng trong sản xuất. Bạn nói rằng vấn đề cho bạn là do tường lửa. Bạn có tình cờ nhớ được hiệu ứng gây ra bởi tường lửa hay tường lửa đã làm gì để gây ra điều này không?
Ibrahim Najjar

5

Mã phản hồi HTTP bằng 0 cho biết rằng yêu cầu AJAX đã bị hủy.

Điều này có thể xảy ra hoặc từ thời gian chờ, phá thai XHR hoặc tường lửa dậm chân theo yêu cầu. Thời gian chờ là phổ biến, điều đó có nghĩa là yêu cầu không thực hiện được trong một thời gian xác định. Việc phá thai XHR rất đơn giản để thực hiện ... bạn thực sự có thể gọi .abort () trên một đối tượng XMLHttpRequest để hủy cuộc gọi AJAX. ( Đây là cách thực hành tốt cho một ứng dụng một trang nếu bạn không muốn các cuộc gọi AJAX trở lại và cố gắng tham chiếu các đối tượng đã bị hủy. ) Như đã đề cập trong câu trả lời được đánh dấu, tường lửa cũng có thể hủy yêu cầu và kích hoạt điều này 0 phản hồi.

XHR Abort: Hủy bỏ các yêu cầu Ajax bằng 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()

Điều đáng chú ý là việc chạy phương thức .abort () trên một đối tượng XHR cũng sẽ thực hiện gọi lại lỗi. Nếu bạn đang thực hiện bất kỳ loại xử lý lỗi nào phân tích các đối tượng này, bạn sẽ nhanh chóng nhận thấy rằng XHR bị hủy bỏ và XHR hết thời gian giống hệt nhau, nhưng với jQuery, textStatus được chuyển đến lệnh gọi lại lỗi sẽ bị "hủy bỏ" khi bị hủy bỏ và "hết thời gian" với thời gian chờ xảy ra. Nếu bạn đang sử dụng Zepto (rất giống với jQuery), errorType sẽ là "lỗi" khi bị hủy bỏ và "hết thời gian" khi hết thời gian chờ.

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

4

Như chi tiết của câu trả lời này trên trang này , mã trạng thái 0 có nghĩa là yêu cầu không thành công vì một số lý do và thư viện javascript diễn giải lỗi là mã trạng thái 0.

Để kiểm tra điều này, bạn có thể thực hiện một trong các cách sau:

1) Sử dụng tiện ích mở rộng chrome này, Yêu cầu chuyển hướng url của bạn từ httpsphiên bản url sang httpphiên bản, vì điều này sẽ gây ra lỗi bảo mật nội dung hỗn hợp và cuối cùng tạo ra mã trạng thái là 0. Ưu điểm của phương pháp này là bạn không Bạn hoàn toàn không phải thay đổi ứng dụng của mình và bạn chỉ cần "viết lại" url của mình bằng tiện ích mở rộng này.

2) Thay đổi mã của ứng dụng của bạn để tùy ý chuyển hướng điểm cuối của bạn sang httpphiên bản url thay vì httpsphiên bản (hoặc ngược lại). Nếu bạn làm điều này, yêu cầu sẽ thất bại với mã trạng thái 0.


1
"Sử dụng tiện ích mở rộng chrome này" - Một tiện ích mở rộng chrome? Trong một ứng dụng HTA?
Quentin

4
Điểm tốt cho chắc chắn! Nhưng hầu hết mọi người đến đây không nhận được ở đây cho các ứng dụng HTA. Họ đang googling "mã trạng thái javascript 0" hoặc một cái gì đó tương tự, và đến đây - vì vậy tôi nghĩ rằng phần HTA của câu hỏi này là ít quan trọng nhất, nói chung, và cuối cùng điều này vẫn có liên quan.
Brad park

2

Trong trường hợp của tôi, trạng thái trở thành 0 khi tôi quên đặt WWW trước tên miền của mình. Bởi vì tất cả các yêu cầu ajax của tôi đều được mã hóa http: /WWW.mydomain.com và trang web được tải sẽ chỉ là http://mydomain.com, nó trở thành một vấn đề bảo mật vì nó là một tên miền khác. Tôi đã kết thúc việc chuyển hướng trong tệp .htaccess của mình để luôn đặt www ở phía trước.


1

Trong trường hợp của tôi, đó là do cuộc gọi AJAX đã bị trình duyệt chặn vì chính sách cùng nguồn gốc . Đó là điều ít được mong đợi nhất, bởi vì tất cả các HTML và tập lệnh của tôi được phục vụ từ đó 127.0.0.1. Làm thế nào họ có thể được coi là có nguồn gốc khác nhau?

Dù sao, nguyên nhân sâu xa là một <base>thẻ trông vô tội :

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

Tôi đã xóa <base>thẻ mà tôi không cần, và bây giờ nó hoạt động tốt!


1

Tôi tìm thấy một lý do mới và không có giấy tờ cho trạng thái == 0. Đây là những gì tôi có:

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

Đó không phải là nguồn gốc chéo, mạng hoặc do yêu cầu bị hủy (theo mã hoặc do điều hướng của người dùng). Không có gì trong bảng điều khiển dành cho nhà phát triển hoặc nhật ký mạng.

Tôi có thể tìm thấy rất ít tài liệu về trạng thái () (Mozilla không liệt kê nó, W3C cũng vậy) và không có tài liệu nào đề cập đến "bị từ chối".

Hóa ra đó là trình chặn quảng cáo của tôi (uBlock Origin trên Firefox).


1

Ngoài câu trả lời của Lee , bạn có thể tìm thêm thông tin về nguyên nhân thực sự bằng cách chuyển sang yêu cầu đồng bộ , vì bạn cũng sẽ có một ngoại lệ:

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

Ví dụ :

NetworkError: Xảy ra lỗi mạng.


0

Trong trường hợp bất kỳ ai khác gặp phải vấn đề này, điều này đã gây ra cho tôi các vấn đề do yêu cầu AJAX và yêu cầu biểu mẫu thông thường được gửi. Tôi đã giải quyết nó bằng dòng sau:

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

Chìa khóa ở đó là return return, khiến cho biểu mẫu không được gửi. Bạn cũng có thể trả về false từ bên trong submitfunc (), nhưng tôi thấy việc viết nó rõ ràng là rõ ràng hơn.


1
Ngăn chặn mặc định hoạt động cho điều này là tốt. Đó là một chức năng javascript ngăn trình duyệt thực hiện hành vi mặc định trong các sự kiện, cho phép bạn ghi đè / ngăn chặn gọn gàng chức năng gốc ... trả về false cũng làm điều tương tự.
Cory Danielson

0

Cần lưu ý rằng tải lên tệp ajax vượt quá client_max_body_sizechỉ thị cho nginx sẽ trả về mã lỗi này.


0

Nếu bạn đang thử nghiệm trên PC cục bộ, nó sẽ không hoạt động. Để kiểm tra ví dụ Ajax, bạn cần đặt các tệp HTML trên máy chủ web.


0

Trong trường hợp của tôi, lỗi xảy ra trong một trang được yêu cầu với giao thức HTTP, với một Javascript bên trong nó đang cố gắng thực hiện một yêu cầu HTTPS. Và ngược lại.

Sau khi tải trang, nhấn F12 (hoặc Ctrl + U) và xem mã HTML của trang của bạn. Nếu bạn thấy một cái gì đó như thế trong mã của bạn:

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

Và trang của bạn đã được yêu cầu theo cách này:

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

Bạn chắc chắn sẽ phải đối mặt với lỗi này.

Để khắc phục, hãy đặt giao thức của yêu cầu Javascript bằng với giao thức của yêu cầu trang.

Tình huống này liên quan đến các giao thức khác nhau, đối với các yêu cầu trang và js, đã được đề cập trước đây trong câu trả lời của Brad park , nhưng, tôi đoán rằng kỹ thuật chẩn đoán được trình bày ở đây dễ dàng hơn, đối với phần lớn người dùng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.