Что такое net :: ERR_HTTP2_PROTOCOL_ERROR? - PullRequest
10 голосов
/ 03 октября 2019

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

Например, происходит следующий сценарий:

  1. Я захожу на сайт по протоколу HTTPS

  2. Мой канал Twitter, интегрированный через https://publish.twitter.com, вообще не загружен

  3. Iможет заметить в консоли ERR_HTTP2_PROTOCOL_ERROR

  4. Если я удаляю код для загрузки канала Twitter, ошибка остается

  5. Если я захожу на сайтв 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). Все остальные активы на вкладке «Сеть» имеют успешный возврат, кроме самого документа. line that failed in console

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

Chrome header

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

Firefox header

Запрос 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).

Ответы [ 5 ]

2 голосов
/ 04 октября 2019

ВСЕ ПРАВО

Я не понял, что именно происходит, но нашел решение. Похоже, виновником была функция CDN в OVH . Он был установлен на моей хост-службе, но отключен для моего домена (потому что я все равно не чувствую, что мне это нужно). Почему-то при включении все работает. Я предполагаю, что это заставляет Apache использовать протокол HTTP2;что я пока не понимаю, так это то, что в каждом из моих заголовков действительно было упоминание HTTP2, что, как я предполагаю, означает, что сервер отвечал с использованием правильного протокола.

В любом случае, решение для моего особого случая -включите эту опцию CDN на всех соответствующих доменах. Если кто-то лучше понимает, что здесь могло произойти, не стесняйтесь делиться объяснениями.

Большое спасибо всем, кто помог!

1 голос
/ 21 октября 2019

У меня возникла похожая проблема, я получал ERR_HTTP2_PROTOCOL_ERROR на один из запросов HTTP GET.

Я заметил, что обновление Chrome было отложено, поэтому я обновил браузер Chrome до последней версии, и ошибка исчезла в следующий раз, когда я перезапустил браузер.

0 голосов
/ 15 ноября 2019

Я столкнулся с этим, потому что http2-сервер закрыл соединение при отправке большого ответа в Chrome.

Почему? Потому что это просто настройка сервера http2 с именем WriteTimeout .

0 голосов
/ 14 ноября 2019

в течение нескольких недель меня также раздражала эта «ошибка» «net :: ERR_HTTP2_PROTOCOL_ERROR 200», это происходило на изображениях, сгенерированных PHP. Наконец, он находится на уровне заголовков и, в частности, заголовка "(Content-Length: '. Filesize ($ cache_file));"который, очевидно, не вернул точный размер ... Я удалил этот заголовок, и теперь все отлично работает. Видимо, поэтому Chrome проверяет точность данных, передаваемых через заголовки, если они не соответствуют = "не удалось"

С уважением

РЕДАКТИРОВАТЬ: 14/11/2019 в 15:15 Я нашелпричина неправильного расчета длины содержимого через размер файла: сжатие GZIP активно для файлов PHP, поэтому просто исключите этот файл с помощью «SetEnvIfNoCase Request_URI ^ / thumb.php no-gzip -vary» в .htaccess. Это также работает, и мы сохраняем заголовок Content-lenght.

0 голосов
/ 30 октября 2019

У меня возникла та же проблема (asp, c # - HttpPostedFileBase) при публикации файла размером более 1 МБ (даже если приложение не имеет каких-либо ограничений по размеру файла), мне помогло упрощение класса модели. Если у вас возникла эта проблема, попробуйте удалить некоторые части модели и посмотреть, поможет ли она в любом случае. Звучит странно, но у меня получилось.

...