Могу ли я вернуть версию протокола "HTTP/1.1" при использовании HTTP/2?
В моем проекте у меня есть некоторые жестко закодированные коды состояния и описания HTTP, такие как:
$this->output->set_header("HTTP/1.1 422 Unprocessable entity");
И я не совсем уверен насчет Раздела 8.1.3 спецификаций HTTP/2, потому что похоже, что сервер HTTP/2 больше не возвращает полную строку заголовка (протокол, код состояния и описание статуса). Например:
HTTP/1.1 200 OK
Content-Type: image/jpeg
Content-Length: 123
Станет:
HEADERS
+ END_STREAM
+ END_HEADERS
:status = 200
content-type = image/jpeg
content-length = 123
При использовании моей демонстрации браузеры не беспокоятся об ответах, начинающихся с "HTTP/1.1".
Поэтому мне интересно, нужно ли срочно полагаться на среду для возврата правильного кода состояния (среда создает строку, начинающуюся с $_SERVER['SERVER_PROTOCOL']). Смотрите этот так вопрос для реализации. Или, если это не имеет значения.
1 ответ
Как вы сказали, в протоколе HTTP/2 нет текстовой строки состояния, которая могла бы использоваться для передачи строки, содержащей "HTTP/1.1". HTTP/2 передает код состояния только в числовой форме в значении псевдозаголовка :status
, который будет подобран клиентом.
Таким образом, главный вопрос заключается в том, что делает выбранная вами структура, когда вы звоните
$this->output->set_header("HTTP/1.1 422 Unprocessable entity");
Если фреймворк в случае HTTP/2 проанализирует эту строку, извлеките только 422
и положить его в :status
тогда псевдоголовый все нормально. Если он не будет анализировать его, то я не знаю, как он сможет установить код состояния. Ваш фреймворк / веб-сервер также не может использовать эту строку в качестве обычного заголовка - поскольку то, что вы здесь задаете, это всего лишь одно строковое значение. Установка нормального заголовка потребует имени и значения заголовка. Так что я думаю, что ваш фреймворк просто удаляет ненужные данные, и все в порядке.
Что вы могли бы сделать, если вы заинтересованы, это использовать nghttp2
инструмент командной строки nghttp
отладить соединение. Сделать звонок как nghttp -v https://your-host
и он отладит и распечатает все полученные значения заголовков, включая псевдозаголовки.