net :: ERR_HTTP2_PROTOCOL_ERROR는 무엇입니까?


36

현재 웹 사이트에서 작업 중이며 net::ERR_HTTP2_PROTOCOL_ERROR 200Chrome 에서 오류가 발생합니다. 정확히이 오류를 유발할 수있는 것이 확실하지 않습니다 .HTTPS로 웹 사이트에 액세스 할 때만 팝업되는 것을 알았습니다. 100 % 관련성이 있다고 확신 할 수는 없지만 자바 스크립트가 제대로 실행되지 않는 것처럼 보입니다.

예를 들어, 다음 시나리오가 발생합니다.

  1. HTTPS로 웹 사이트에 액세스하고 있습니다

  2. https://publish.twitter.com을 통해 통합 된 내 Twitter 피드 가 전혀로드되지 않았습니다

  3. 콘솔에서 ERR_HTTP2_PROTOCOL_ERROR를 확인할 수 있습니다

  4. Twitter 피드를로드하기 위해 코드를 제거해도 오류가 남아 있습니다.

  5. HTTP로 웹 사이트에 액세스하면 Twitter 피드가 나타나고 오류가 사라집니다

Chrome은 오류를 발생시키는 유일한 웹 브라우저입니다. Edge와 Firefox 모두에서 잘 작동합니다. (NB : Safari로 시도했지만 비슷한 kcferrordomaincfnetwork 303오류가 있습니다)

오류에 '200'이라는 언급이 있기 때문에 서버에서 반환 한 헤더와 관련이 있는지 궁금하고 404/500 페이지가 아무것도 트리거하지 않습니다.

오류가 전혀 문서화되어 있지 않습니다. Google 검색은 결과가 거의 없습니다. 또한 최신 Chrome 릴리스에 표시되는 것으로 나타났습니다. 오류는 v.64.X에서 발생하지 않지만 v.75 +에서 발생합니다 (OS에 관계없이 Mac에서도 작동합니다).

이 시점에서 조사 할 단서가 있으면 기뻐할 것입니다!

미리 감사드립니다.

트리스탄


편집 1 : Firefox의 Website OK 와 관련이 있지만 Safari (kCFErrorDomainCFNetwork 오류 303)가 아닌 Chrome (net :: ERR_SPDY_PROTOCOL_ERROR)


편집 2 : 추가 조사 결과는 다음과 같습니다.

  • 서버가 2XX 대신 404를 반환하면 정확히 같은 페이지에 오류가 발생하지 않습니다.
  • HTTPS 인증서로 로컬에서 오류가 발생하지 않습니다.
  • 다른 인증서를 사용하는 다른 서버 (OVH 둘 다)에서 오류가 발생 함
  • 5.6에서 7.3까지 사용 된 PHP 버전에 관계없이 오류가 발생합니다 (사용 된 프레임 워크 : Cakephp 2.10).

편집 3 : 요청 한대로 아래는 전체 웹 페이지 인 실패한 리소스에 대해 반환 된 헤더입니다. HTTP 헤더 200이있는 각 페이지에서 오류가 발생하더라도 해당 페이지는 항상 클라이언트 브라우저에로드되지만 요소 (예 : 외부 Twitter 피드)가 누락되는 경우가 있습니다. 네트워크 탭의 다른 모든 자산은 전체 문서 자체를 제외하고 성공을 거두게됩니다. 콘솔에서 실패한 라인

Chrome 헤더 (오류 포함) :

크롬 헤더

Firefox 헤더 (오류 없음) :

Firefox 헤더

curl --head --http2콘솔 의 요청은 다음과 같은 성공을 반환합니다.

HTTP/2 200 
date: Fri, 04 Oct 2019 08:04:51 GMT
content-type: text/html; charset=UTF-8
content-length: 127089
set-cookie: SERVERID31396=2341116; path=/; max-age=900
server: Apache
x-powered-by: PHP/7.2
set-cookie: xxxxx=0919c5563fc87d601ab99e2f85d4217d; expires=Fri, 04-Oct-2019 12:04:51 GMT; Max-Age=14400; path=/; secure; HttpOnly
vary: Accept-Encoding

편집 4 : chrome : // net-export / 및 https://netlog-viewer.appspot.com 도구 로 더 깊이 들어 가려고 하면 요청이 RST_STREAM으로 끝납니다.

t=123354 [st=5170]    HTTP2_SESSION_RECV_RST_STREAM
                      --> error_code = "2 (INTERNAL_ERROR)"
                      --> stream_id = 1

이 다른 게시물 에서 읽은 내용에 대해 " HTTP / 2에서 클라이언트가 요청을 중단하려면 RST_STREAM을 전송합니다. 서버가 RST_STREAM을 수신하면 클라이언트에 DATA 프레임 전송을 중지하여 응답을 중지합니다. (또는 다운로드) 연결은 여전히 ​​다른 요청에 사용할 수 있으며 중단 된 요청과 동시에 요청 / 응답이 계속 진행될 수 있습니다. [...] RST_STREAM이 출발 할 때까지 클라이언트가 서버로 전송하는 경우 요청의 전체 컨텐츠가 전송되고 클라이언트에 도달하여이를 폐기합니다. 그러나 응답 컨텐츠가 큰 경우 RST_STREAM을 전송하면 전체적으로 서버에 도달 할 수있는 좋은 기회가 있습니다. 응답 내용이 전송되므로 대역폭이 절약됩니다. "

설명 된 동작은 내가 관찰 할 수있는 것과 동일합니다. 그러나 그것은 브라우저가 범인이라는 것을 의미하며, 왜 하나는 200 개의 헤더가 있고 다른 하나는 404 (JS를 비활성화하면 동일)로 동일한 두 페이지에서 발생하는 이유를 이해할 수 없습니다.


aboutssl.org/fix-google-chrome-error-err_ssl_protocol_error (110 개) 결과 중 하나 밖으로의 그 -
Jaromanda X가

나는 분명히 여기에 왔으며 클라이언트 측 관련 답변 만 있으며 해결책은 될 수 없습니다.
Tristan G

Chrome 이외의 브라우저에서 오류가 발생합니까? 그렇지 않은 경우 어떻게 클라이언트 측 (특히 Chrum 브라우저) 문제가 아닌가?
Jaromanda X

1
잘못된 HTTP 응답 헤더 일 수 있습니다. 전체 사이트가로드되지 않습니까? 아니면 하나 이상의 자산입니까? HTTP / 2를 사용할 때로드되지 않는 자산에 대한 http 응답에 표시된 HTTP 응답 헤더를 포함하도록 질문을 편집 할 수 있습니까? 또한 작동하는 For Edge / Firefox?
Barry Pollard

1
거기에 잘못된 것이 없으므로 주된 요청이 아닌 것으로 의심됩니다. 또한 쿠키를 무시하십시오-그렇지 않습니다. 당신이 t을 알아낼 수 있는지이 시도 : michalspacek.com/...을
배리 폴라드에게

답변:


7

몇 주 동안 나는 또한이 "버그"에 짜증이났다.

net :: ERR_HTTP2_PROTOCOL_ERROR 200

필자의 경우 PHP로 생성 된 이미지에서 발생했습니다.

그것은 header()레벨에 있었고, 특히 이것에 관한 것입니다 :

header ('Content-Length:'. Filesize($cache_file));

분명히 정확한 크기를 반환하지 않았으므로 삭제하고 모든 것이 잘 작동합니다.

따라서 Chrome은 헤더를 통해 전송 된 데이터의 정확성을 확인하고 일치하지 않으면 실패합니다.

편집하다

content-lengthvia filesize가 잘못 계산 된 이유 를 찾았 GZIP습니다. PHP 파일 에서 압축이 활성화되어 있으므로 해당 파일을 제외하면 문제가 해결됩니다. 이 코드를 .htaccess:

SetEnvIfNoCase Request_URI ^ / thumb.php no-gzip -vary

작동하고 헤더를 유지합니다 Content-length.


1
당신은 저를 구해 주셨습니다 !!! 그러나 여전히 실제 문제를 이해하지 못합니다. 제 경우 오류는 https에서만 발생하지만 http에서는 발생하지 않습니다.
니코

안녕하세요 @Nico, 예, 정상이라고 생각합니다. 공지 된 크기와 브라우저 (Chrome)가 다운로드 한 파일의 크기 사이의 확인은 https 프로토콜에서만 수행해야합니다. 이 솔루션이 도움이 될 수있어 매우 기쁩니다!
Xtendo

1
어떻게 든 "Content-Length"대신 "Content -Length"를 사용했습니다. 공간을 제거한 후 작동했습니다. 감사합니다.
마틴 복권

안녕하세요 @Martin Lottering 그것이 지금 당신을 위해 작동하게되어 매우 기쁩니다! :-)
Xtendo

6

정확히 무슨 일이 일어나고 있는지 알지 못했지만 해결책을 찾았습니다.

OVHCDN 기능은 범인이었습니다. 호스트 서비스에 설치했지만 필요하지 않아 도메인에서 사용하지 않도록 설정했습니다.

어떻게 든 그것을 활성화하면 모든 것이 작동합니다.

필자는 아파치가 HTTP2 프로토콜을 사용하도록 강요한다고 생각하지만, 내가 이해하지 못하는 것은 실제로 각 헤더에 HTTP2 언급이 있다는 것입니다. 서버가 올바른 프로토콜을 사용하여 응답하고 있다고 가정합니다.

그래서 매우 특별한 경우의 해결책은 모든 관련 도메인에서 CDN 옵션을 활성화하는 것이 었습니다.

여기서 일어날 수있는 일을 더 잘 이해하는 사람이 있으면 언제든지 설명을 공유하십시오.


cdn

4

Chrome에 큰 응답을 보낼 때 http2 서버 가 연결을 닫았 기 때문에이 문제가 발생했습니다 .

왜? WriteTimeout이라는 http2 서버의 설정일 뿐입니다 .


4

제 경우에는 웹 서버에 디스크 공간이 남아 있지 않았습니다.


흥미롭게도 프론트 웹 서버에 디스크가 가득 찼습니다. 로그에 눈에 띄는 것이 없기 때문에 nginx 가이 상황을 포착하지 못하는 것처럼 보입니다.
vchrizz

3

비슷한 문제가 발생하여 HTTP GET 요청 중 하나에서 ERR_HTTP2_PROTOCOL_ERROR가 발생했습니다.

Chrome 업데이트가 보류 중임을 알았으므로 Chrome 브라우저를 최신 버전으로 업데이트했으며 다음에 브라우저를 다시 시작할 때 오류가 발생했습니다.


2

node-js 응용 프로그램을 외부 세계에 노출시키는 Nginx 서버가있을 때이 문제가 발생했습니다. Nginx는 파일 (css, js, ...)을 압축 gzip하고 Chrome을 사용하여 동일한 모양으로 만들었습니다 .

node-js 서버가 gzip으로 컨텐츠를 압축 한 것을 발견했을 때 문제가 해결되었습니다. 어쨌든,이 이중 압축으로이 문제가 발생합니다. node-js 압축을 취소하면 문제가 해결되었습니다.


6
여러 사람이이 게시물에 이미 답변 한 것을 볼 수 있으며, 매번 문제의 근본 원인이 달라졌습니다. 이 오류는 실제로 혼란 스럽습니다.
Tristan G

2

이 오류는 현재 수정 중입니다 : https://chromium-review.googlesource.com/c/chromium/src/+/2001234

그러나 그것은 nginx 설정을 변경하는 데 도움이되었습니다.

  • gzip을 켜는 중;
  • add_header 'Cache-Control' '저장 없음, 캐시 없음, 재확인, 프록시 재확인, max-age = 0';
  • 만료

필자의 경우 Nginx는 Node.js 응용 프로그램의 역방향 프록시 역할을합니다.


이 답변도 저에게 효과적이었습니다. 올바른 구문을 보려면 docs.nginx.com/nginx/admin-guide/web-server/compression 링크를 참조하십시오
Bhargavi Gopalachar

1

예를 들어 example.com (new.example.com)에 "new"와 같은 새 도메인 이름을 등록 할 때 이런 일이 발생했습니다. 이름은 해외에서 확인할 수 있지만 내 위치에서 몇 시간 동안 일시적으로 확인할 수 없습니다. 그래서 프록시를 사용하여 net::ERR_HTTP2_PROTOCOL_ERRORAJAX 게시물에 대한 크롬 콘솔에서 본 웹 사이트를 테스트했습니다 . 몇 시간 후, 이름을 로컬에서 다시 사용할 수 있었을 때 오류가 사라졌습니다.

그 오류의 원인은 AJAX 요청이 프록시로 리디렉션되지 않았기 때문에 로컬 DNS 확인 프로그램으로 해결되지 않은 웹 사이트를 방문하기 때문입니다.


1

이 오류가 여러 번 발생했으며 서버에서 클라이언트로 큰 리소스 (3MB 이상)를 전송했기 때문에 발생했습니다.


0

1MB보다 큰 파일을 게시 할 때 동일한 응용 프로그램 (asp, c #-HttpPostedFileBase)이 발생했습니다 (응용 프로그램에 파일 크기에 대한 제한이 없더라도). 모델 클래스의 단순화가 도움이되었습니다. 이 문제가 발생하면 모델의 일부를 제거하고 어떤 식 으로든 도움이되는지 확인하십시오. 이상하게 들리지만 나를 위해 일했습니다.


0

지난 주에 AJAX를 통해 DELETE 요청을 PHP 서버에 보내려고 시도 하면서이 문제가 발생했습니다. 최근에 호스트 및 PHP 파일을 저장하는 SSL 인증서가있는 호스팅 계획을 업그레이드했습니다. SSL 인증서를 추가 한 이후 더 이상이 문제가 발생하지 않습니다. 이것을 기대하면이 이상한 오류가 발생합니다.


0

나는 또한이 오류에 직면했으며 그 뒤에 여러 가지 이유가있을 수 있다고 생각합니다. 광산은 ARR 시간이 초과되었습니다.

필자의 경우 브라우저는 리디렉션 규칙을 설정 한 리버스 프록시 사이트에 요청했으며 해당 프록시 사이트는 결국 실제 사이트를 요청합니다. 이제 거대한 데이터의 경우 2 분 5 초 이상 걸리고 서버의 응용 프로그램 요청 라우팅 시간 제한이 2 분으로 설정되었습니다. 아래 단계에 따라 ARR 시간 제한을 늘려서이 문제를 해결했습니다. 1. IIS로 이동합니다. 2. 서버 이름을 클릭합니다. 3. 가운데 창에서 응용 프로그램 요청 라우팅 캐시를 클릭합니다. 4. 오른쪽 창에서 서버 프록시 설정을 클릭합니다. 5 시간 제한을 늘립니다 6 적용을 클릭하십시오.


0

우리의 경우 이유는 유효하지 않은 헤더였습니다. 편집 4에서 언급했듯이 :

  • 통나무를 가져 가라
  • 뷰어에서 이벤트를 선택하십시오
  • HTTP2_SESSION을 선택 했습니다

비슷한 것을 찾으십시오.

HTTP2_SESSION_RECV_INVALID_HEADER

-> error = "헤더 이름에 잘못된 문자가 있습니다."

-> header_name = " 문자 세트 = UTF-8 "


0

우리 팀은 우리가 제공하는 단일 자바 스크립트 파일에서 이것을 보았습니다. 다른 모든 파일은 정상적으로 작동했습니다. 우리는 http2다시 또는 http1.1다음으로 전환했다 . 우리는 궁극적으로 "정보 유출"을 잘못 감지 한 회사 필터 (Trustwave)가 있음을 발견했습니다 (우리는 파일 / 파일 이름에서 사회 보장 번호와 비슷한 것을 감지했다고 생각합니다). 회사에서이 필터를 조정하면 문제가 해결되었습니다.net::ERR_INCOMPLETE_CHUNKED_ENCODINGERR_CONTENT_LENGTH_MISMATCH


0

긴 Base64 문자열이있는 페이지에서이 문제가 발생했습니다. CloudFlare를 사용하기 때문에 문제가 발생합니다.

세부 사항 : https://community.cloudflare.com/t/err-http2-protocol-error/119619 .

포럼 게시물의 주요 섹션 :

여러 브라우저에서 시크릿 탭을 추가로 테스트 한 다음 BASE64에서 실제 .png 이미지로 코드를 변경 한 후에는 어떤 브라우저에서도 문제가 다시 발생하지 않습니다. .png는 base64가되기 전에 약 500kb를 가졌기 때문에 CloudFlare는 도메인과 heroku 사이의 프록시로서 동일한 줄 (base64가 긴 문자열이므로)에 거대한 텍스트 줄 문제가 있습니다. 앞서 언급했듯이 직접 Heroku URL을 누르는 것도 문제가 발생하지 않았습니다.

임시 해킹은 CloudFlare에서 HTTP / 2를 비활성화하는 것입니다.

CloudFlare에서 HTTP / 2를 비활성화하지 않아도되는 더 나은 솔루션을 다른 사람이 생산할 수 있기를 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.