Как узнать со стороны сервера, поддерживает ли клиент http/2

Я пишу аналитический сервер, который будет использоваться веб-пользователями. Одним из параметров, который я хочу проверить, является их поддержка браузера. Скажите, пожалуйста, могу ли я получить недостоверную информацию и как:

  • Проверьте, поддерживает ли клиент (браузер пользователя) http/2
  • Проверьте, поддерживает ли клиент (пользовательский браузер) push-запросы http/2, как определить, когда сервер отправляет push-сообщения, способен ли клиент использовать его, вероятно, это какой-то js-тест, или не говорите мне.
  • Проверьте, поддерживает ли клиент (пользовательский браузер) QUIC, UDP-версию http/2.

2 ответа

Решение

Это зависит от используемого веб-сервера и сведений о подключении к нему.

Например, Apache предоставляет следующие переменные: https://httpd.apache.org/docs/2.4/mod/mod_http2.html

Включая эти переменные:

Variable Name:  Value Type:   Description:
HTTP2           flag          HTTP/2 is being used.
H2PUSH          flag          HTTP/2 Server Push is enabled for this connection and also supported by the client.
H2_PUSHED       string        empty or PUSHED for a request being pushed by the server.

Таким образом, вы можете легко добавить это к своим файлам журнала, используя LogFormat, например:

LogFormat "%h %l %u %t %{ms}T \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %{SSL_PROTOCOL}x %{SSL_CIPHER}x %{Content-Encoding}o %{H2_PUSHED}e" combined

А затем посмотрите из файлов журнала, обслуживался ли он по HTTP/2.0 и был ли он PUSHED или нет. Например:

86.1.2.3 - - [11/Jul/2017:22:14:56 +0100] 2 "GET / HTTP/2.0" 200 1700 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36" TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256 br
86.1.2.3 - - [11/Jul/2017:22:14:56 +0100] 3 "GET /assets/css/common.css HTTP/2.0" 200 5381 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36" TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256 br PUSHED

Эти переменные также доступны для CGI-скриптов и т.п. Обратите внимание, что эти переменные будут установлены, только если HTTP/2 действительно используется.

Не все веб-серверы раскрывают этот уровень детализации так же легко, как Apache, и многие не поддерживают HTTP/2 push, поэтому, вероятно, не могут обнаружить это, поскольку сами не поддерживают его!

Мне неизвестны какие-либо веб-браузеры, которые предоставляют эти данные из приветственного сообщения HTTPS-клиента (когда HTTP/2 будет согласован), так как большинство предоставляют только сведения о текущем соединении, а не поддержку каждого протокола и только после сеанса HTTPS. настроен. Например, переменные Apache HTTPS приведены здесь: http://httpd.apache.org/docs/current/mod/mod_ssl.html

QUIC меньше поддерживается веб-серверами, поэтому его не так просто обнаружить.

Фактически обнаружить все это со стороны клиента сложнее, поскольку, насколько я знаю, они не подвержены JavaScript. Самый простой вариант - вызвать скрипт CGI через HTTP/2, который возвращает результат тех значений, которые предоставляет веб-сервер.

Обратите внимание, что отправленные ресурсы будут использоваться только при необходимости. А если нужно и не толкать, то все равно будет извлечено. Таким образом, ваша идея js-теста, предположительно обнаружившего, используется ли отправленный ресурс, не будет однозначно говорить, поддерживает ли клиент push, потому что ресурс мог быть выбран.

Лучшее, что вы сможете сделать, - это определить их браузер через своего пользовательского агента, а затем сопоставить его с некоторой базой данных браузеров и функций.

Конечно, пользовательский агент может лгать, но большинство из них заявят о себе соответствующим образом.

Другие вопросы по тегам