В настоящее время я работаю над веб-сайтом, который вызывает ошибку net::ERR_HTTP2_PROTOCOL_ERROR 200
в Google Chrome. Я не уверен, что именно может спровоцировать эту ошибку, я только заметил, что она выскакивает только при доступе к сайту в HTTPS. Я не могу быть на 100% уверен, что это связано, но похоже, что это препятствует правильному выполнению javascript.
Например, происходит следующий сценарий:
Я захожу на сайт по протоколу HTTPS
Мой канал Twitter, интегрированный через https://publish.twitter.com, вообще не загружен
Iможет заметить в консоли 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).