О чем net::ERR_HTTP2_PROTOCOL_ERROR?Php

Кемеровские программисты php общаются здесь
Ответить
Гость
 О чем net::ERR_HTTP2_PROTOCOL_ERROR?

Сообщение Гость »


В настоящее время я работаю над веб-сайтом, который вызывает ошибку net::ERR_HTTP2_PROTOCOL_ERROR 200 в Google Chrome. Не знаю точно, что может спровоцировать эту ошибку, просто заметил, что она выскакивает только при доступе к сайту по HTTPS. Я не могу быть на 100% уверен, что это связано, но похоже, что это мешает правильному выполнению JavaScript.

Например, происходит следующий сценарий:
[*]
Я захожу на сайт по HTTPS
[*]
Мой канал Twitter, интегрированный через https://publish.twitter.com, вообще не загружается
[*]
Я вижу в консоли ERR_HTTP2_PROTOCOL_ERROR
[*]
Если я удалю код загрузки ленты Twitter, ошибка останется
[*]
Если я захожу на сайт по HTTP, появляется лента Twitter и ошибка исчезает

Google Chrome — единственный веб-браузер, вызывающий ошибку: он хорошо работает как в Edge, так и в Firefox. (Примечание: я пробовал использовать Safari, и у меня возникла аналогичная ошибка kcferrordomaincfnetwork 303)

Мне было интересно, может ли это быть связано с заголовком, возвращаемым сервером, поскольку в ошибке есть упоминание «200», а страница 404/500 ничего не вызывает.

Дело в том, что ошибка вообще не документирована. Поиск Google дает мне очень мало результатов. Более того, я заметил, что он появляется в самых последних выпусках Google Chrome; ошибка не появляется в версии 64.X, но появляется в версии 75+ (независимо от ОС; хотя я работаю на Mac).

Может быть связано с тем, что веб-сайт в порядке в Firefox, но не в Safari (ошибка kCFErrorDomainCFNetwork 303) и в Chrome (net::ERR_SPDY_PROTOCOL_ERROR)

Результаты дальнейшего расследования следующие:
[*]Ошибка не появляется на той же странице, если сервер возвращает 404 вместо 2XX [*]ошибка не появляется локально с сертификатом HTTPS. [*]ошибка появляется на другом сервере (оба являются OVH), который использует другой сертификат [*]Ошибка появляется независимо от того, какая версия PHP используется: от 5.6 до 7.3 (используемая платформа: Cakephp 2.10)
В соответствии с запросом ниже приведен возвращенный заголовок для неисправного ресурса, которым является вся веб-страница. Даже если ошибка возникает на каждой странице, имеющей HTTP-заголовок 200, эти страницы всегда загружаются в браузере клиента, но иногда какой-то элемент отсутствует (в моем примере — внешний канал Twitter). Все остальные активы на вкладке «Сеть» имеют успешный результат, за исключением самого документа.
Изображение


Заголовок Google Chrome (с ошибкой):


Изображение


Заголовок Firefox (без ошибок):


Изображение


Запрос curl --head --http2 в консоли возвращает следующий успех:

HTTP/2 200 дата: Пт, 04 октября 2019 г., 08:04:51 GMT тип контента: текст/html; кодировка = UTF-8 длина контента: 127089 установить cookie: SERVERID31396 = 2341116; путь =/; максимальный возраст = 900 сервер: Апач на базе x: PHP/7.2 set-cookie: xxxxxx=0919c5563fc87d601ab99e2f85d4217d; истекает = пятница, 04 октября 2019 г., 12:04:51 по Гринвичу; Максимальный возраст=14400; путь =/; безопасный; HttpOnly варьироваться: Accept-Encoding Попытка углубиться с помощью инструментов chrome://net-export/ и https://netlog-viewer.appspot.com сообщает мне, что запрос заканчивается RST_STREAM :

t=123354 [st=5170] HTTP2_SESSION_RECV_RST_STREAM --> код_ошибки = "2 (ВНУТРЕННЯ_ОШИБКА)" --> идентификатор потока = 1 Что я прочитал в другом посте: «В HTTP/2, если клиент хочет прервать запрос, он отправляет RST_STREAM. Когда сервер получает RST_STREAM, он прекращает отправку кадров DATA на клиент, тем самым останавливая ответ (или загрузку).Соединение по-прежнему можно использовать для других запросов, и запросы/ответы, которые были одновременными с прерванным, могут продолжать выполняться. [...] Возможно, что к моменту прохождения RST_STREAM от клиента к серверу все содержимое запроса будет в пути и дойдет до клиента, который его отбросит. Однако для большого содержимого ответа отправка RST_STREAM может иметь хороший шанс дойти до сервера до того, как будет отправлено все содержимое ответа, и, следовательно, сэкономит полосу пропускания."

Описанное поведение такое же, как то, которое я наблюдаю. Но это означало бы, что виноват браузер, и тогда я бы не понял, почему это происходит на двух одинаковых страницах, одна из которых имеет заголовок 200, а другая 404 (то же самое произойдет, если я отключу JS).
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»