source

HTTP 요구가 상태 코드0을 반환하는 것은 무엇을 의미합니까?

ittop 2023. 4. 2. 11:53
반응형

HTTP 요구가 상태 코드0을 반환하는 것은 무엇을 의미합니까?

fetch나 XMLHttpRequest 등의 JavaScript 네트워크 호출이나 기타 유형의 HTTP 네트워크 요청이 HTTP 상태 코드0 으로 실패했을 경우, 이것은 무엇을 의미합니까?

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

나는 테스트로 네트워크를 완전히 분리해 보았다.관련이 없을 수도 있지만 이로 인해 상태 코드 17003(IIRC)이 생성되었습니다.이것은 대략적인 검색에서 "DNS 서버 검색에 실패했습니다"를 의미합니다.

일부 장소 및 시스템에서는 동일한 코드가 정상적으로 동작하지만 특정 환경에서는 상태 코드 0으로 장애가 발생하여 responseText가 제공되지 않습니다.

이것은 인터넷 URL에 대한 일반적인 HTTP POST입니다.file://는 포함되지 않습니다.Firefox에서 성공했음을 나타내는0 이 반환되는 경우가 있는 것으로 알고 있습니다.

여기 있는 답들 중 많은 것들이 틀렸다.사람들은 자신의 특정 사례에서 상태==0의 원인이 무엇인지를 파악하여 그것을 해답으로 일반화시키는 것 같다.

실질적으로 실패한 XmlHttpRequest에 대한 status==0은 정의되지 않은 오류로 간주해야 합니다.

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

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

이 상태 코드를 생성하는 일반적인 상황 중 일부는 다른 응답에 반영되지만 다음 문제 중 하나 또는 전혀 해당되지 않을 수 있습니다.

  1. 잘못된 크로스 오리진 요구(CORS 참조)
  2. 방화벽 차단 또는 필터링
  3. 요청 자체가 코드로 취소되었습니다.
  4. 설치된 브라우저 확장이 일을 망치고 있습니다.

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

에러 코드는, (헤더조차 반환되지 않았기 때문에) 응답이 비어 있는 것을 나타내고 있다고 생각합니다.즉, 접속이 받아들여지고 나서 정상적으로 닫힙니다(TCP FIN).원인에는 여러 가지가 있지만 설명에 따르면 방화벽이 원인일 가능성이 가장 높은 것으로 보입니다.

브라우저에 따라서는 jQuery 기반의 AJAX 콜이 HTTP 상태 코드0 의 성공 콜백을 호출합니다.상태 코드 "0"은 보통 AJAX 호출이 완료되기 전에 다른 페이지로 이동한 사용자를 의미합니다.

사용하고 있는 것과 같은 테크놀로지 스택은 아니지만 누군가에게 도움이 될 것입니다.

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 상태 = 0 및 XMLHttpRequest 상태 서버에서 스크립트를 실행하지 않는 경우 텍스트 = unknown이 도움이 됩니다.

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

이 문제는 타임아웃, XHR 중단 또는 방화벽이 요청을 스탬핑할 때 발생할 수 있습니다.타임아웃은 일반적으로 지정된 시간 내에 요구가 실행되지 않았음을 의미합니다.XHR 낙태는 매우 간단합니다...실제로 XMLHttpRequest 오브젝트에서 .abort()를 호출하여 AJAX 콜을 취소할 수 있습니다(AJAX 콜이 반환되어 파괴된 오브젝트를 참조하려고 하지 않는 경우, 이것은 단일 페이지 어플리케이션에서 좋은 방법입니다).마크된 답변에서 설명한 바와 같이 방화벽은 요청을 취소하고 이 0 응답을 트리거할 수도 있습니다.

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 는, 중단했을 때에 「abort」가 되어 타임 아웃이 발생합니다.Zepto(jQuery와 매우 유사)를 사용하는 경우 errorType은 중단되면 "error"가 되고 타임아웃이 발생하면 "timeout"이 됩니다.

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

회피책: 최종 결과

방화벽 문제와 관련된 것으로 판단하고 해결 방법을 생각해 냈습니다.이와 같은 문제를 안고 있는 고객이 있는 경우는, 다음과 같이 대처했습니다.

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

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

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

  4. HTML 페이지에는 (Microsoft를 사용하여) 서버에 데이터를 게시하는 javascript가 포함되어 있습니다.XMLHTTP).

이것이 비슷한 요구를 가진 모든 사람에게 도움이 되기를 바랍니다.이 경우, 그것은 무역 박람회에서 노트북으로 사용되는 플래시 게임입니다.이 무역 박람회가 다른 나라에서 열렸기 때문에 우리는 노트북에 접근할 수 없었고 고객에게 이메일을 보낼 수 밖에 없었습니다.

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

이것을 테스트하려면 , 다음의 몇개의 조작을 클릭합니다.

1) 이 Chrome 확장자를 사용하여 에서 URL을 리다이렉트합니다.https에 대한 URL 버전http이 경우 혼합 콘텐츠 보안 오류가 발생하고 최종적으로 상태 코드 0이 생성됩니다.이 방법의 장점은 앱을 전혀 변경할 필요가 없으며, 이 확장자를 사용하여 URL을 간단히 "다시 쓰기"할 수 있다는 것입니다.

2) 앱의 코드를 변경하여 옵션으로 엔드포인트가httpurl 버전 대신https버전(또는 그 반대)을 참조해 주세요.이렇게 하면 요청이 실패하고 상태 코드가 0이 됩니다.

제 경우 WWW를 도메인 앞에 두는 것을 잊으면 0이 됩니다.저의 모든 ajax 요청은 http:/WWW.mydomain.com로 하드코드 되어 있고 로드된 웹 페이지는 http://mydomain.com이기 때문에 다른 도메인이기 때문에 보안 문제가 되었습니다..htaccess 파일에서 항상 www를 앞에 놓기 위해 리다이렉트를 하게 되었습니다.

상태 == 0에 대한 문서화되어 있지 않은 새로운 이유를 찾았습니다.제가 먹은 건 다음과 같습니다.

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

크로스 오리진, 네트워크 또는 취소된 요청(코드 또는 사용자 탐색에 의한)에 의한 것이 아닙니다.개발자 콘솔 또는 네트워크 로그에 아무것도 없습니다.

state()에 관한 문서는 거의 찾을 수 없었습니다(Mozilla는 기재되어 있지 않습니다, W3C는 기재되어 있지 않습니다).또, 「거부」라고 하는 것은 없었습니다.

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

제 경우는, 같은 발신기지 정책에 의해서 브라우저에 의해서 AJAX 콜이 차단되고 있었기 때문입니다.예상 밖의 일이었습니다. 왜냐하면 모든 HTML과 스크립트는127.0.0.1어떻게 그들이 다른 기원을 가지고 있다고 생각될 수 있을까요?

어쨌든, 근본 원인은 순진한 외모였다.<base> 삭제:

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

제거했습니다.<base>태그는 필요없었고, 지금은 정상적으로 동작하고 있습니다!

Lee의 답변 외에도 동기 요청으로 전환하여 실제 원인에 대한 자세한 정보를 찾을 수 있습니다. 예외도 있습니다.

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

예를 들어 다음과 같습니다.

네트워크 오류: 네트워크 오류가 발생했습니다.

다른 사람이 이 문제를 발견했을 경우 AJAX 요청과 일반 양식 요청 전송으로 인해 문제가 발생했습니다.다음 행으로 해결했습니다.

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

이 키는 반환 false이며 이로 인해 폼이 전송되지 않습니다.submitfunc()의 내부에서 false를 반환할 수도 있지만, 저는 그것을 명확하게 기술하고 있습니다.

가 Ajax를 초과하는 하십시오.client_max_body_size는 이 코드를 합니다.nginx는 에러 코드를 반환합니다

로컬 PC로 테스트하고 있는 경우는, 동작하지 않습니다.Ajax의 예를 테스트하려면 HTML 파일을 웹 서버에 저장해야 합니다.

저의 경우 HTTP protocol로 요청한 페이지에서 오류가 발생하였고, 그 안에 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의 답변에서 언급되었지만, 대부분의 사용자에게는 여기에 제시된 진단 기법이 더 쉽다고 생각합니다.

언급URL : https://stackoverflow.com/questions/872206/what-does-it-mean-when-an-http-request-returns-status-code-0

반응형