Зараз я працюю над веб-сайтом, який викликає 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: Можливо, це стосується веб-сайту OK на Firefox, але не на Safari (помилка kCFErrorDomainCFNetwork 303), а також Chrome (нетто: 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).