Это зависит от используемого веб-сервера и сведений, которые он предоставляет о подключении к нему.
Apache, например, предоставляет следующие переменные: https://httpd.apache.org/docs/2.4/mod/mod_http2.html#envvars
Включая эти переменные:
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-сессии. Например, HTTPS-переменные Apache приведены здесь: http://httpd.apache.org/docs/current/mod/mod_ssl.html#envvars
QUIC в меньшей степени поддерживается веб-серверами, поэтому его не так легко обнаружить.
На самом деле обнаружить все это со стороны клиента сложнее, поскольку, насколько мне известно, они не подвергаются воздействию JavaScript. Самый простой вариант — вызвать сценарий CGI через HTTP/2, который возвращает результат этих значений, предоставленных веб-сервером.
Обратите внимание, что выталкиваемые ресурсы будут использоваться только в случае необходимости. А если нужен и не протолкнут, то он все равно будет получен. Таким образом, ваша идея теста js, предположительно определяющего, используется ли отправленный ресурс, не будет окончательно говорить, поддерживает ли клиент push, потому что ресурс мог быть извлечен.
person
Barry Pollard
schedule
11.07.2017