Почему мне пришлось отключить HTTP/2 в AWS Application Load Balancer, чтобы предотвратить ERR_SPDY_PROTOCOL_ERROR?

Когда я развернул свое веб-приложение в среде AWS с помощью Application Load Balancer (ALB), некоторые из моих конечных точек веб-службы не возвращали никаких данных, и мой браузер Chrome сообщал об этой ошибке для некоторых вызовов http: ERR_SPDY_PROTOCOL_ERROR

После нахождения этой рекомендации я отключил поддержку HTTP/2 в своей конфигурации ALB, и теперь все работает.

Почему мне пришлось отключить HTTP/2 в моем ALB? В чем здесь корень проблемы? Нужно ли что-то менять в коде моего веб-сервиса, чтобы я мог использовать HTTP/2?

ОБНОВИТЬ

Вот заголовки ответа:

HTTP/1.1 200
Date: Wed, 09 Jan 2019 21:39:13 GMT
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Locations Reached: Data to populate locations reached map

Как следует из одного из приведенных ниже ответов, виновником, вероятно, является тот факт, что в одном из моих заголовков ("Достигнутые местоположения") есть пробел в имени, который недействителен / неверен. Я позабочусь, чтобы место заменили тире.

1 ответ

Решение

Обычно означает, что у вас неверный заголовок HTTP/ 2. HTTP/ 2 в этом отношении более строг, чем HTTP/ 1.1.

Так что имена заголовков HTTP с двоеточиями, пробелами, новыми строками (например, открывающие кавычки, но забывающие закрыть кавычки в вашей конфигурации) и тому подобное в имени недопустимы (они могут существовать в значениях заголовка, но не в именах).

Подробнее об отладке смотрите здесь: https://www.michalspacek.com/chrome-err_spdy_protocol_error-and-an-invalid-http-header.

Добавьте заголовки ответа HTTP/ 1.1 к своему вопросу и, возможно, сможете указать правильное направление.