HTTP 요청이 상태 코드 0을 반환한다는 것은 무엇을 의미합니까?


130

fetch 또는 XMLHttpRequest와 같은 JavaScript 네트워크 호출 또는 다른 유형의 HTTP 네트워크 요청이 HTTP 상태 코드 0으로 실패하는 것은 무엇을 의미합니까?

다른 코드는 HTTP 사양에서 3 자리이므로 유효한 HTTP 상태 코드 인 것 같습니다.

테스트로 네트워크를 완전히 분리하려고했습니다. 관련이 없지만 상태 코드 17003 (IIRC)이 발생하여 커서 검색에서 "DNS 서버 조회 실패"를 의미합니다.

동일한 코드가 일부 위치 및 시스템에서 제대로 작동하지만 특정 환경에서는 상태 코드 0으로 실패하고 responseText가 제공되지 않습니다.

인터넷 URL에 대한 일반적인 HTTP POST입니다. Firefox에서 성공을 나타내는 0을 반환 할 수 있음을 이해하는 file : //은 포함하지 않습니다.


방화벽 때문일 수 있습니까? 클라이언트가 앱을 실행하는 OS는 무엇입니까?
shahkalpesh

유용 할 수 있습니다 : stackoverflow.com/a/12622082/386579
shasi kanth


Firefox에서도 같은 문제가 있었는데 광고 차단 플러그인은 단어가 포함 된 URL에 대한 모든 요청을 막습니다.banner
Jan

답변:


56

오류 코드는 응답이 비어 있음을 나타냅니다 (헤더조차도 반환되지 않음). 이는 연결이 수락 된 후 정상적으로 종료되었음을 의미합니다 (TCP FIN). 이 문제를 일으킬 수있는 여러 가지가 있지만 설명에 따라 일부 방화벽 형태가 가장 범인으로 보입니다.


2
아마 당신이 옳을 것 같아요. (@sleepycod에 의해 지적 된 바와 같이 wininet.dll은 실제 http 상태 코드 가 없으면 일부 상태 코드를 반환 할 것으로 예상됩니다 .)
mike nelson

1
반드시 올바른 것은 아닙니다. 나는 같은 문제를 겪었지만 내 경우에는 요청이 전송되지 않았습니다. 그 이유는 Firefox 광고 차단기가 URL에 단어가 포함 된 요청을 막았 기 때문입니다.banner
Jan

194

여기에 많은 답변이 잘못되었습니다. 사람들이 특정 경우에 status == 0의 원인을 파악한 다음이를 답변으로 일반화하는 것 같습니다.

실제로, 실패한 XmlHttpRequest에 대한 status == 0은 정의되지 않은 오류로 간주되어야합니다.

실제 W3C 사양은 여기에 0이 반환되는 조건을 정의합니다. https://fetch.spec.whatwg.org/#concept-network-error

스펙 (fetch 또는 XmlHttpRequest)에서 볼 수 있듯이이 코드는 서버에 접속하기 전에 발생한 오류의 결과 일 수 있습니다.

이 상태 코드를 생성하는 일반적인 상황 중 일부는 다른 답변에 반영되지만 다음과 같은 문제가 있거나 없을 수 있습니다.

  1. 잘못된 교차 출처 요청 ( CORS 참조 )
  2. 방화벽 차단 또는 필터링
  3. 요청 자체가 코드에서 취소되었습니다.
  4. 설치된 브라우저 확장 프로그램이 문제를 일으키고 있습니다.

브라우저가 이러한 여러 가지 상태 == 0 시나리오에 대해 자세한 오류보고를 제공하면 도움이 될 것입니다. 실제로 status == 0이 유용한 콘솔 메시지와 함께 제공되는 경우도 있지만 다른 정보는 없습니다.


4
Firefox 애드온 NoScript는 신뢰할 수없는 호스트에 대한 XHR 요청을 취소 할 수 있습니다.
Ivan Solntsev 12

5
+1, 이것은 모두 정확하며 "일종의 오류가 발생했습니다"는 실질적인 해석입니다. 사양에 의해 제공된 가능한 원인의 포괄적 인 목록에 관심이있는 사람들을 위해 stackoverflow.com/a/26451773/1709587에 분류를 게시했습니다 .
Mark Amery 16:27에서

1
Mark Amery가 상세하게 설명한 사례 중 가장 문제가되는 것은 cors 사례입니다. 오류로 인해 응답이 cors 유효성 검증에 실패하면 cors 유효성 검증에 실패하면 응답에 액세스 할 수 없으므로 http 상태 대신 0 상태가됩니다. 유지 보수를 받고 503에 응답하는 웹 API를 감지하려고 할 때 특히 실망합니다. 유지 보수 중이 API가 cors를 존중하지 않으면 503을 감지 할 수 없으며 0을 얻습니다. 소지품.
Frédéric

CORS 문제가 발생했습니다 : 페이지가 처음로드 된 경우 http대신 대신 사용하는 것이 좋습니다 . 또 다른 단어는 아약스 수행하지 않는 통해 페이지를 통해 액세스 된 경우 와 아약스 수행하지 않는 통해이 페이지가 initiallly를 통해 액세스 된 경우 . httpshttpPOSThttpshttpPOSThttphttps
Victor Ponamarev

동기식 요청은 0 상태에서 더 의미있는 예외를 발생
시킵니다

35

브라우저에 따라 jQuery 기반 AJAX 호출은 HTTP 상태 코드 0으로 성공 콜백을 호출합니다. 상태 코드 "0"은 일반적으로 사용자가 다른 페이지로 이동했음을 의미합니다. AJAX 호출이 완료되었습니다.

사용하는 것과 동일한 기술 스택은 아니지만 누군가에게 유용 할 것입니다.


이 페이지의 조회수는 10,000 회이므로 사람들은 아마도 그 문제를 많이 경험할 것입니다.
mike nelson

아니면 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

상태 코드가 "0"인 경우 웹 서버에서 실행되거나 웹 서버없이 로컬 웹 페이지에서 요청을하려고합니까?

웹 서버에서 스크립트를 실행하지 않는 경우 XMLHttpRequest status = 0 및 XMLHttpRequest statusText = unknown 이 도움이 될 수 있습니다.


코드 감사합니다. 아니요, 로컬 요청이 아니며 로컬로 실행되는 vbscript에서 인터넷의 웹 서버에 대한 요청입니다.
마이크 넬슨

6

해결 방법 : 우리가 무엇을했는지

우리는 이것이 방화벽 문제와 관련이 있다고 생각했으며, 그로 인해 해결 방법을 찾았습니다. 누구든지 동일한 문제가 발생하면 다음과 같이하십시오.

  1. 이전과 마찬가지로 HTA를 사용하여 로컬 하드 디스크의 텍스트 파일에 데이터를 기록합니다.

  2. 사용자가 "데이터를 서버로 다시 보내기"를 클릭하면 HTA는 데이터를 읽고 해당 데이터를 XML 데이터 아일랜드로 포함하는 HTML 페이지를 작성합니다 (실제로는 SCRIPT LANGUAGE = XML 스크립트 블록 사용).

  3. HTA가 브라우저에서 HTML 페이지에 대한 링크를 시작합니다.

  4. HTML 페이지에는 이제 Microsoft.XMLHTTP를 사용하여 서버에 데이터를 게시하는 자바 스크립트가 포함됩니다.

이것이 비슷한 요구 사항을 가진 사람에게 도움이되기를 바랍니다. 이 경우에는 전시회의 랩톱에서 사용되는 플래시 게임이었습니다. 우리는 랩탑에 접속할 수 없었으며이 전시회가 다른 나라에서 일어나고 있었기 때문에 고객에게만 이메일을 보낼 수있었습니다.


안녕하세요, 저는 생산중인 고객에게 발생하는 비슷한 문제를 조사하고 있습니다. 당신은 당신에게 문제가 방화벽에 의한 것이라고 말합니다. 방화벽으로 인해 어떤 영향이 있었는지, 또는 방화벽으로 인해 어떤 일이 발생했는지 기억하십니까?
이브라힘 나자르

5

HTTP 응답 코드 0은 AJAX 요청이 취소되었음을 나타냅니다.

이는 시간 초과, XHR 중단 또는 요청시 방화벽이 멈춤으로써 발생할 수 있습니다. 시간 초과는 일반적이며 요청이 지정된 시간 내에 실행되지 않았 음을 의미합니다. XHR 낙태는 매우 간단합니다. 실제로 XMLHttpRequest 객체에서 .abort ()를 호출하여 AJAX 호출을 취소 할 수 있습니다. ( 이것은 AJAX 호출을 반환하고 파괴 된 객체를 참조하려고 시도하지 않으려는 경우 단일 페이지 응용 프로그램에 좋습니다. ) 표시된 답변에서 언급했듯이 방화벽은 요청을 취소하고이를 트리거 할 수 있습니다 응답이 없습니다.

XHR 중단 : jQuery를 사용하여 Ajax 요청 중단

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()

XHR 객체에서 .abort () 메소드를 실행하면 오류 콜백이 발생한다는 점에 주목할 가치가 있습니다. 이러한 객체를 구문 분석하는 모든 종류의 오류 처리를 수행하는 경우 중단 된 XHR과 시간 초과 XHR이 동일하지만 jQuery를 사용하면 오류 콜백에 전달 된 textStatus가 중단되면 "중지"됩니다. 시간 종료 상태의 "시간 종료"가 발생합니다. Zepto (jQuery와 매우 유사)를 사용하는 경우 errorType은 중단되면 "error"이고 시간 초과가 발생하면 "timeout"입니다.

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

4

이 페이지 의이 답변에서 자세히 설명했듯이 상태 코드 0은 어떤 이유로 요청이 실패했음을 의미하며 Javascript 라이브러리는 실패를 상태 코드 0으로 해석합니다.

이를 테스트하려면 다음 중 하나를 수행하십시오.

1)이 크롬 확장 기능을 사용 Requestly 로부터 URL을 리디렉션 https받는 당신의 URL의 버전 http이 혼합 된 컨텐츠 보안 오류의 원인이되므로, 버전, 궁극적으로이 방법의 장점은 당신이 돈이다 0의 상태 코드를 생성 앱을 전혀 변경할 필요가 없으며이 확장 프로그램을 사용하여 URL을 "재 작성"할 수 있습니다.

2) 선택적으로 엔드 포인트가 http버전 대신 URL 버전으로 리디렉션되도록 https(또는 반대로) 앱 코드를 변경하십시오 . 이렇게하면 상태 코드 0으로 요청이 실패합니다.


1
"이 크롬 확장 프로그램 사용"— 크롬 확장 프로그램? HTA 응용 프로그램에서?
Quentin

4
확실히 좋은 지적입니다! 그러나 여기에 도착하는 대부분의 사람들은 HTA 애플리케이션을 위해 여기에 오지 않습니다. 그들은 "자바 스크립트 http 상태 코드 0"또는 그와 비슷한 것을 인터넷에 연결하여 여기에 도착합니다. 따라서이 질문의 HTA 부분은 전체적으로 가장 중요하지 않으며 궁극적으로 여전히 관련이 있다고 생각합니다.
Brad Parks

2

필자의 경우 WWW를 도메인 앞에 두는 것을 잊었을 때 상태가 0이되었습니다. 내 모든 아약스 요청이 http : /WWW.mydomain.com으로 하드 코딩되고로드 된 웹 페이지가 http://mydomain.com 이되기 때문에 도메인이 다르기 때문에 보안 문제가되었습니다. 나는 항상 www를 앞에두기 위해 .htaccess 파일에서 리디렉션을 수행했습니다.


1

필자의 경우 AJAX 호출이 동일한 출처 정책으로 인해 브라우저에서 차단 되었기 때문입니다 . 모든 HTML 및 스크립트가에서 제공되므로 예상치 못한 결과 127.0.0.1였습니다. 그들은 어떻게 다른 기원을 가진 것으로 간주 될 수 있습니까?

어쨌든 근본 원인은 순진한 표정이었습니다 <base>.

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

나는 <base>필요하지 않은 태그를 제거했으며 이제는 잘 작동합니다!


1

status == 0에 대한 새롭고 문서화되지 않은 이유를 찾았습니다. 다음은 내가 가진 것입니다.

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

교차 출처, 네트워크 또는 취소 된 요청 (코드 또는 사용자 탐색)으로 인한 것이 아닙니다. 개발자 콘솔 또는 네트워크 로그에 아무것도 없습니다.

state () (Mozilla는 그것을 나열하지 않고 W3C는 나열하지 않음)에 대한 문서는 거의 찾을 수 없었으며 "거절"에 대해서는 언급하지 않았습니다.

광고 차단기 (Firefox의 uBlock Origin)였습니다.


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 () 내부에서 false를 반환 할 수도 있지만 명시 적으로 작성하면 더 명확합니다.


1
기본 설정 방지도이 기능을 수행합니다. 자바 스크립트 기능으로 이벤트 중에 브라우저가 기본 동작을 실행하지 못하게하여 기본 기능을 깔끔하게 무시 / 예방할 수 있습니다. false를 반환해도 마찬가지입니다.
코리 다니엘 슨

0

client_max_body_sizenginx에 대한 지시문을 초과하는 ajax 파일 업로드 는이 오류 코드를 리턴합니다.


0

로컬 PC에서 테스트하는 경우 작동하지 않습니다. 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.