Obecnie pracuję nad witryną, która powoduje net::ERR_HTTP2_PROTOCOL_ERROR 200
błąd w Google Chrome. Nie jestem pewien, co dokładnie może sprowokować ten błąd, zauważyłem, że wyskakuje on tylko podczas uzyskiwania dostępu do witryny w HTTPS. Nie mogę być w 100% pewien, że jest on powiązany, ale wygląda na to, że uniemożliwia to prawidłowe wykonanie javascript.
Na przykład dzieje się następujący scenariusz:
Uzyskuję dostęp do strony w HTTPS
Mój kanał na Twitterze zintegrowany przez https://publish.twitter.com nie jest w ogóle ładowany
W konsoli mogę zauważyć ERR_HTTP2_PROTOCOL_ERROR
Jeśli usunę kod, aby załadować kanał Twitter, błąd pozostanie
Jeśli uzyskam dostęp do strony w HTTP, pojawi się kanał na Twitterze, a błąd zniknie
Google Chrome to jedyna przeglądarka internetowa powodująca błąd: działa dobrze zarówno w Edge, jak i Firefox. (Uwaga: próbowałem z Safari i mam podobny kcferrordomaincfnetwork 303
błąd)
Zastanawiałem się, czy może to być związane z nagłówkiem zwróconym przez serwer, ponieważ w błędzie jest wzmianka o „200”, a strona 404/500 niczego nie wyzwala.
Chodzi o to, że błąd wcale nie jest udokumentowany. Wyszukiwarka Google daje mi bardzo mało wyników. Ponadto zauważyłem, że pojawia się w najnowszych wydaniach Google Chrome; błąd nie pojawia się w wersji 64.X, ale występuje w wersji 75. + (niezależnie od systemu operacyjnego; pracuję na komputerze Mac).
Wszelkie wskazówki w tym miejscu do zbadania byłyby mile widziane!
Z góry dziękuję.
Tristan
Edycja 1: Może być powiązany z witryną OK w przeglądarce Firefox, ale nie w przeglądarce Safari (kCFErrorDomainCFNetwork error 303) ani w Chrome (netto :: ERR_SPDY_PROTOCOL_ERROR)
Edycja 2: Wyniki dalszych badań są następujące:
- błąd nie pojawia się na tej samej stronie, jeśli serwer zwraca 404 zamiast 2XX
- błąd nie pojawia się lokalnie z certyfikatem HTTPS
- błąd pojawia się na innym serwerze (oba są OVH), który używa innego certyfikatu
- pojawia się błąd bez względu na to, jaka wersja PHP jest używana, od 5.6 do 7.3 (użyte ramy: Cakephp 2.10)
Edycja 3: Zgodnie z żądaniem poniżej znajduje się zwrócony nagłówek informujący o awarii zasobu, którym jest cała strona internetowa. Nawet jeśli błąd pojawia się na każdej stronie mającej nagłówek HTTP 200, strony te zawsze ładują się w przeglądarce klienta, ale czasami brakuje elementu (na przykład zewnętrznego kanału Twittera). Każdy inny zasób na karcie Sieć ma zwrot z powodzeniem, z wyjątkiem całego dokumentu.
Nagłówek Google Chrome (z błędem):
Nagłówek Firefoksa (bez błędu):
curl --head --http2
Żądanie w konsoli zwraca następujący sukces:
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
Edycja 4: Próbuję wejść głębiej dzięki narzędziom chrome: // net-export / i https://netlog-viewer.appspot.com mówi mi, że żądanie kończy się RST_STREAM:
t=123354 [st=5170] HTTP2_SESSION_RECV_RST_STREAM
--> error_code = "2 (INTERNAL_ERROR)"
--> stream_id = 1
W przypadku tego, co przeczytałem w tym drugim poście : „ W HTTP / 2, jeśli klient chce przerwać żądanie, wysyła RST_STREAM. Gdy serwer odbierze RST_STREAM, przestanie wysyłać ramki danych do klienta, zatrzymując w ten sposób odpowiedź (lub pobieranie). Połączenie jest nadal użyteczne w przypadku innych żądań, a żądania / odpowiedzi, które były zbieżne z tym, które zostało przerwane, mogą nadal się rozwijać. [...] Możliwe jest, że do czasu, gdy RST_STREAM podróżuje z od klienta do serwera, cała treść żądania jest przesyłana i dotrze do klienta, który go odrzuci. Jednak w przypadku treści o dużej odpowiedzi wysłanie RST_STREAM może mieć dużą szansę na dotarcie do serwera przed całą treść odpowiedzi jest wysyłana, co pozwala zaoszczędzić przepustowość. ”
Opisane zachowanie jest takie samo jak to, które mogę zaobserwować. Oznaczałoby to jednak, że winowajcą jest przeglądarka, a następnie nie rozumiem, dlaczego dzieje się to na dwóch identycznych stronach, z których jedna ma nagłówek 200, a druga 404 (to samo dotyczy wyłączenia JS).