В настоящее время я работаю над сайтом, который вызывает 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. (NB: я пробовал с Safari, и у меня похожая kcferrordomaincfnetwork 303
ошибка)
Мне было интересно, может ли это быть связано с заголовком, возвращаемым сервером, так как в ошибке есть упоминание «200», а страница 404/500 ничего не вызывает.
Дело в том, что ошибка не документирована вообще. Поиск в Google дает мне очень мало результатов. Более того, я заметил, что это появляется в самых последних выпусках Google Chrome; ошибка не появляется на v.64.X, но на v.75 + (независимо от ОС; я работаю на Mac tho).
Любая подсказка на данный момент для расследования будет с благодарностью!
Заранее спасибо.
Тристан
Изменить 1: Может быть связано с веб-сайта в порядке в Firefox, но не в Safari (kCFErrorDomainCFNetwork ошибка 303), ни Chrome (net :: ERR_SPDY_PROTOCOL_ERROR)
Изменить 2: Результаты дальнейших исследований следующие:
- ошибка не появляется на той же самой странице, если сервер возвращает 404 вместо 2XX
- ошибка не появляется на локальном с сертификатом HTTPS
- ошибка появляется на другом сервере (оба OVH), который использует другой сертификат
- ошибка появляется независимо от того, какая версия PHP используется, от 5.6 до 7.3 (используемая среда: Cakephp 2.10)
Редактировать 3: В соответствии с запросом ниже приводится возвращаемый заголовок для ресурса, на котором произошел сбой, - это целая веб-страница. Даже если ошибка запускается на каждой странице, имеющей HTTP-заголовок 200, эти страницы всегда загружаются в браузер клиента, но иногда отсутствует элемент (в моем примере - внешний канал Twitter). Все остальные активы на вкладке «Сеть» имеют успешный возврат, кроме самого документа.
Заголовок Google Chrome (с ошибкой):
Заголовок 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).