Tại sao AJAX trả về mã trạng thái HTTP 0?


139

Vì một số lý do, trong khi sử dụng AJAX (với ứng dụng đã phát triển) trình duyệt chỉ dừng tải lên và trả về mã trạng thái của 0. Lý do tại sao điều này xảy ra?

Câu trả lời:


110

Một trường hợp khác:

Có thể nhận được mã trạng thái 0nếu bạn đã gửi một cuộc gọi AJAX và việc làm mới trình duyệt đã được kích hoạt trước khi nhận được phản hồi AJAX . Cuộc gọi AJAX sẽ bị hủy và bạn sẽ nhận được trạng thái này.


9
Cảm ơn bạn đã chỉ ra điều này, nó khiến tôi nhận ra rằng (cũng như làm mới trình duyệt) một lần gửi biểu mẫu có thể hủy cuộc gọi ajax.
Magnus Smith

1
Chỉ cần làm<form onsubmit="return false;">
Heitor

1
Đề xuất của @ Heitor đã làm việc cho tôi - nút "gửi" của biểu mẫu của tôi đang làm mới trang, trong khi đó tôi đã có javascript để chạy một cuộc gọi ajax khi nhấp vào nút "gửi". Kết quả là cuộc gọi ajax đã bị hủy
Nic Scozzaro

Này, tôi đã bỏ lỡ mộte.preventDefault();
SparK

97

Theo kinh nghiệm của tôi, bạn sẽ thấy trạng thái 0 khi:

  • thực hiện kịch bản chéo trang (nơi truy cập bị từ chối)
  • yêu cầu một URL không thể truy cập (lỗi chính tả, sự cố DNS, v.v.)
  • yêu cầu bị chặn (kiểm tra trình chặn quảng cáo của bạn)
  • như trên, nếu yêu cầu bị gián đoạn (trình duyệt điều hướng khỏi trang)

1
Tôi nhận được nó khi kết nối bị từ chối. Ví dụ: khi gỡ lỗi trang web của tôi bằng Visual Studio, nếu tôi đã dừng phiên gỡ lỗi, mọi yêu cầu đã cố gắng kết nối sẽ nhận được net :: ERR_CONNECTION_REFUSED và mã trạng thái sẽ bằng không. Điều đó có ý nghĩa, vì bạn không thể có mã trạng thái nếu bạn không thể kết nối với máy chủ được cho là đang cung cấp.
Triynko

Tôi có thể xác nhận. Tôi đã có trạng thái == 0 sau khi tắt máy chủ web của mình.
9ilsdx 9rvj 0lo

tôi có lỗi vì 'kịch bản chéo trang'; tôi nên làm gì?

1
@nasimjahednia tra cứu CORS ... máy chủ bạn đang cố truy cập cần cho phép tạo kịch bản chéo trang từ tên miền của bạn.
Langdon

Tôi bối rối. Có cách nào để lấy lại mã lỗi HTTP không? Đây là rất nhiều trường hợp khác nhau ở đây (415, 404, v.v.)
Edwin Evans

8

Vấn đề tương tự ở đây khi sử dụng <button onclick="">submit</button>. Sau đó giải quyết bằng cách sử dụng<input type="button" onclick="">


1
Chơi lô tô!! Bất cứ ai cũng có thể giải thích tại sao điều này?
Jorge

3
Theo mặc định, loại nút HTML là 'gửi', vì vậy, nhấp vào nó sẽ cố gắng gửi dữ liệu biểu mẫu. Vì vậy, nó sẽ thực hiện hành động nhấp chuột, sau đó cố gắng gửi. Nếu bạn sử dụng loại 'nút' thì đó không còn là loại mặc định và sẽ chỉ thực hiện onclick.
Barshe Roussy

7

Mã trạng thái 0 có nghĩa là không thể truy cập url được yêu cầu. Bằng cách thay đổi http: // cái gì đó / cái gì đó để https: // cái gì đó / cái gì đó làm việc cho tôi. IE đưa ra lỗi "quyền bị từ chối" khi mã trạng thái là 0, các trình duyệt khác thì không.


Trong trường hợp này, chrome hiện sẽ để yêu cầu ở trạng thái "Bị đình trệ" cho đến khi hết thời gian. Nó có thể được gây ra bởi cờ Strict-Transport-Security được trả về trong yêu cầu trước đó từ máy chủ đó hoặc có thể là cờ Secure / HttpOnly trên cookie được gửi cùng với yêu cầu.
Shane Hughes

7

Điều quan trọng cần lưu ý là các cuộc gọi ajax có thể thất bại ngay cả trong một phiên được xác định bởi một cookie có tên miền nhất định có tiền tố www. Khi bạn gọi tập lệnh php của bạn, ví dụ như không có www. tiền tố trong url, cuộc gọi sẽ thất bại và ngược lại, quá.


4

Bài viết này đã giúp tôi. Tôi đã gửi biểu mẫu qua AJAX và quên sử dụng return false(sau yêu cầu ajax của tôi) dẫn đến việc gửi biểu mẫu cổ điển nhưng kỳ lạ là nó không được hoàn thành.


Bình minh tôi ghét sự thật tôi lại bị bắt bởi người này! <form onsubmit="return false;">đã lừa
Heitor

3

Bởi vì điều này xuất hiện khi bạn google trạng thái ajax 0 Tôi muốn để lại một số mẹo khiến tôi mất nhiều giờ lãng phí ... Tôi đã sử dụng ajax để gọi một dịch vụ PHP tình cờ là REST_Contoder cho Codeigniter của Phil (không chắc là nó có bất cứ điều gì để làm với nó hay không) và tiếp tục nhận trạng thái 0, đọc lại 0 và nó đang khiến tôi phát điên. Tôi đã gỡ lỗi nó và nhận thấy khi nào tôi sẽ lặp lại và quay lại thay vì thoát khỏi thông điệp tôi sẽ thành công. Cuối cùng tôi tắt gỡ lỗi và thử và nó hoạt động. Có vẻ như trình gỡ lỗi xDebug với PHP bằng cách nào đó đã sửa đổi phản hồi. Nếu bạn sử dụng trình gỡ lỗi PHP, hãy thử tắt nó để xem có giúp được không.


3

Tôi đã tìm thấy một trường hợp khác trong đó jquery cung cấp cho bạn mã trạng thái 0 - nếu vì lý do nào đó XMLHttpRequest không được xác định, bạn sẽ gặp lỗi này.

Rõ ràng điều này sẽ không thường xảy ra trên web, nhưng một lỗi trong bản dựng firefox hàng đêm đã khiến điều này xuất hiện trong một tiện ích bổ sung mà tôi đang viết. :)


1
Bạn đã đưa ra một điểm, tôi đã có một vấn đề với jQuery.ajax()đối tượng XHR. Yêu cầu thậm chí không được tạo trong cuộc gọi AJAX, vẫn nhận được f.open không phải là chức năng và mã trạng thái 0. Nguyên nhân là: Tôi đã trả lại $.ajaxSettings.xhrđối tượng từ đó $.ajaxSetup({xhr}), new window.XMLHttpRequest();thay vào đó đã giải quyết vấn đề
klimpond 16/2/2016


2

Gửi biểu mẫu "Tình cờ" chính xác là vấn đề tôi gặp phải. Tôi chỉ loại bỏ các thẻ FORM hoàn toàn và điều đó dường như để khắc phục vấn đề. Cám ơn mọi người!


2

Chúng tôi đã gặp vấn đề tương tự - mã trạng thái 0 trong cuộc gọi jquery ajax - và chúng tôi mất cả ngày để chẩn đoán nó. Vì chưa ai đề cập đến lý do này, tôi nghĩ tôi sẽ chia sẻ.

Trong trường hợp của chúng tôi, vấn đề là sự cố máy chủ HTTP. Một số lỗi trong PHP đã thổi vào Apache, vì vậy ở đầu máy khách, nó trông như thế này:

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

trong đó test.php chứa mã lỗi. Không có dữ liệu nào được trả về từ máy chủ (thậm chí không có tiêu đề) => cuộc gọi ajax bị hủy bỏ với trạng thái 0.


2

Trong trường hợp của tôi, đó là do chạy máy chủ django của tôi bên dưới http://127.0.0.1:8000/nhưng gửi cuộc gọi ajax tới http://localhost:8000/. Mặc dù bạn sẽ mong muốn chúng ánh xạ tới cùng một địa chỉ, nhưng chúng không đảm bảo rằng bạn không gửi yêu cầu của mình đến localhost.


2

Trong trường hợp của chúng tôi, liên kết trang đã được thay đổi từ https thành http . Mặc dù người dùng đã đăng nhập, họ đã bị ngăn tải bằng AJAX.


hấp dẫn. Tôi hy vọng trường hợp của tôi. Vì iframe của tôi mở bằng https và khi kết quả thành công, tôi gửi ajax đến http sau đó tôi nhận được trạng thái 0
sonic

1

Trong trường hợp của tôi, cài đặt url: ''trong cài đặt ajax sẽ dẫn đến mã trạng thái 0 trong eg8 .. Có vẻ như chỉ không chịu được cài đặt như vậy.


1

Đối với tôi, vấn đề là do công ty lưu trữ (Godaddy) xử lý các hoạt động POST có dữ liệu phản hồi đáng kể (bất cứ thứ gì hơn hàng chục kilobyte) là một mối đe dọa bảo mật. Nếu hơn 6 trong số này xảy ra trong một phút, máy chủ đã từ chối thực thi mã PHP đã trả lời yêu cầu POST trong phút tiếp theo. Tôi không hoàn toàn chắc chắn những gì máy chủ đã làm thay vào đó, nhưng tôi đã thấy, với tcpdump, gói thiết lập lại TCP sắp tới là phản hồi cho yêu cầu POST từ trình duyệt. Điều này khiến mã trạng thái http được trả về trong một đối tượng jqXHR là 0.

Thay đổi các hoạt động từ POST sang GET đã khắc phục sự cố. Không rõ tại sao Godaddy áp đặt giới hạn này, nhưng thay đổi mã dễ hơn thay đổi máy chủ.


1

Tôi nghĩ rằng tôi biết những gì có thể gây ra lỗi này.

Trong google chrome có một tính năng được xây dựng để ngăn chặn các cuộc tấn công ddos ​​cho các tiện ích mở rộng của Google chrome.

Khi các yêu cầu ajax liên tục trả về hơn 500 lỗi trạng thái, nó bắt đầu điều tiết các yêu cầu.

Do đó có thể nhận trạng thái 0 theo các yêu cầu sau.


1

Trong một nỗ lực để giành giải thưởng cho lý do ngu ngốc nhất cho vấn đề được mô tả.

Quên cuộc gọi

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

Có, tôi vẫn nhận được trạng thái trả về số 0 từ cuộc gọi 'mở'.


1

Trong trường hợp của tôi, tôi đã nhận được điều này nhưng chỉ trên Safari Mobile. Vấn đề là tôi đã sử dụng URL đầy đủ ( http://example.com/whthing.php ) thay vì URL tương đối (anything.php). Điều này không có ý nghĩa gì cả, nó không thể là vấn đề XSS vì trang web của tôi được lưu trữ tại http://example.com . Tôi đoán Safari nhìn vào phần http và tự động gắn cờ nó là một yêu cầu không an toàn mà không kiểm tra phần còn lại của URL.


1

Trong phần khắc phục sự cố của mình, tôi thấy AJAX xmlhttpRequest.status == 0 này có thể có nghĩa là cuộc gọi của khách hàng chưa đến máy chủ, nhưng không thành công do sự cố ở phía máy khách. Nếu phản hồi là từ máy chủ, thì trạng thái phải là mã Phản hồi HTTP 1xx / 2xx / 3xx / 4xx / 5xx. Do đó, việc khắc phục sự cố sẽ tập trung vào vấn đề CLIENT và có thể là kết nối mạng internet bị hỏng hoặc một trong những vấn đề được mô tả bởi @Langdon ở trên.


0

Quan sát Bảng điều khiển trình duyệt trong khi thực hiện yêu cầu, nếu bạn đang thấy "Chính sách nguồn gốc tương tự không cho phép đọc tài nguyên từ xa tại http ajax ..... lý do: tiêu đề cors 'access-control-allow-origin'" thì bạn cần phải thêm "Kiểm soát truy cập-Cho phép-Xuất xứ" trong tiêu đề phản hồi. exa: trong java, bạn có thể thiết lập điều này như answer.setHeader ("Truy cập-Kiểm soát-Cho phép-Xuất xứ", "*") trong đó phản hồi là HttpServletResponse.

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.