HTTP / 2 Server Push не работает, что я делаю не так? - PullRequest
0 голосов
/ 13 января 2019

Это мой первый вопрос, надеюсь, я все делаю правильно.

Я использую веб-сервер LiteSpeed ​​с HTTP / 2 (провайдер общего хостинга), но не могу заставить работать функцию push. Я не совсем уверен, как проверить, работает ли он, но, по крайней мере, насколько я могу судить, он не работает должным образом.

Итак, я посмотрел тонну руководств ( HTTP / 2 Server Push Tutorial или Подробное руководство по HTTP / 2 Server Push в качестве примеров), и все они упоминают об изменении заголовки, добавив следующее:

link: </my/theme/css/style.css>; rel=preload; as=style

Я понимаю, что этот код говорит серверу предварительно загрузить указанный ресурс, в данном случае style.css. Однако, если сервер поддерживает отправку HTTP / 2, он должен вместо этого автоматически выдвигать ресурс (если вы не добавляете nopush в конце). Во второй ссылке упоминается, что это верно для большинства, но не для всех серверов.

Итак, помня об этом, я создал простую тестовую страницу PHP, чтобы посмотреть, смогу ли я заставить ее работать. Результат был такой:

Chrome DevTools показывает вкладку Заголовки с предварительной загрузкой ссылки

Вкладка «Сеть» в DevTools, показывающая результат

Таким образом, в большинстве руководств, которые я видел, упоминалось, что Инициатор на вкладке Сеть для отправляемого ресурса будет говорить Push / Other (или аналогичный) вместо просто Other , но как Вы можете видеть из моего результата, это просто говорит Другое. Не говоря уже о том, что ресурс не загружается в том же запросе, он просто выглядит как простая предварительная загрузка для меня. Я также проверил свой сайт с https://http2.pro/check,, и он говорит, что ни один ресурс не загружен.

Это было проверено с Chrome 71.0.3578.98.

  • Я что-то упустил здесь? Может ли быть проблема с моим сервером?
  • Еще один вопрос. При определении нескольких ресурсов в заголовках для предварительной загрузки и отправки некоторые руководства упоминают создание нескольких элементов ссылки, в то время как другие упоминают запятую, разделяющую их в одном элементе ссылки. Являются ли оба из них правильными, один лучше другого?

Любая помощь или просвещение приветствуется, спасибо!

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Прежде всего вам необходимо выяснить, использует ли ваша инфраструктура заголовки ссылок для активации push. Документация Litespeed здесь не выглядит великолепной, но давайте предположим, что именно так вы активируете push.

Далее нужно проверить, отправляет ли ваш сервер отправленный запрос. Я считаю, что nghttp лучший инструмент для этого, поэтому, если у вас тоже есть к этому доступ, запустите команду, подобную этой, чтобы увидеть кадры HTTP / 2 и, если кадр PUSH_PROMISE отправляется, указывая, что таблица стилей перемещается:

nghttp -anv https://www.example.com

Вы также можете просматривать кадры с помощью Chrome, хотя они только что сделали это намного сложнее, но настаивают на том, чтобы сначала войти на диск, а затем открыть в средстве просмотра. Следуйте инструкциям, аналогичным ответу @ LucasRolff, но для HTTP / 2 или здесь .

Предполагается, что сервер отправляет ресурс, который у вас следующий, с тем, почему Chrome не использует этот отправленный ресурс. Наиболее распространенная причина - использование самоподписанного сертификата TLS для предоставления HTTPS, который браузер не распознает. Даже если вы нажмете на ошибку и получите соединение с красным замком, Chrome не будет использовать кеш для этого соединения, и поэтому не может использовать HTTP / 2 push (который требует использования HTTP / 2 push cache ). Вывод журнала событий nghttp или Chrome должен показать, если это так. В качестве альтернативы попробуйте использовать Firefox, который позволяет использовать HTTP / 2 push, если на нераспознанных сертификатах нажимают.

Наконец, к вашему последнему вопросу:

При определении нескольких ресурсов в заголовках для предварительной загрузки и отправки некоторые руководства упоминают создание нескольких элементов ссылки, в то время как другие упоминают запятую, разделяющую их в одном элементе ссылки. Являются ли оба из них правильными, один лучше другого?

Оба верны. HTTP (HTTP / 1.1 или HTTP / 2) определяет это:

header1: value1
header1: value2

и это:

header1: value1, value2

как синтаксически идентично :

Получатель МОЖЕТ объединить несколько полей заголовка с одним и тем же полем имя в одну пару "field-name: field-value", не меняя семантика сообщения, добавляя каждое последующее значение поля в объединенное значение поля по порядку, разделенное запятой.

0 голосов
/ 13 января 2019

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

Если на веб-сервере LiteSpeed ​​включен QUIC, Chrome v71, похоже, отображает запрос как обычный запрос GET и не будет указывать на его отправку, однако, просматривая средство просмотра сетевых событий в Chrome, он обнаруживает, что он действительно нажата (ищите QUIC_SESSION_PUSH_PROMISE_RECEIVED).

Теперь, это будет иметь место только в том случае, если QUIC в браузере также включен, чего в настоящее время нет в Chrome v71, насколько я могу судить (они отключают и включают вещи время от времени) - поэтому вам нужно либо установить флаг в Chrome, чтобы включить QUIC, и вы увидите вышеупомянутое поведение (вы также должны увидеть http/2+quic/43 в «Протоколе» в инструментах веб-разработчика).

Если QUIC не включен в браузере или на веб-сервере, вы должны увидеть, как файл выдвигается, и Chrome v71 сообщит об этом инициатору «Push / Other».

Теперь в Chrome v73 (выпуск Canary) для «Инициатора» будет установлено значение Other, а для параметра «Размер» должно быть (from memory cache), это указывает на файл, который нужно отправить.

В Google Chrome вы можете перейти в chrome: // net-export / и нажать «Начать запись на диск», затем обновите окно браузера, где у вас есть файл, который вы хотите отправить - остановите измерение и перейдите к https://netlog -viewer.appspot.com / - импортируйте сюда файл json, перейдите в раздел «QUIC», найдите ваше доменное имя в списке и нажмите «Идентификатор соединения».

Затем нажмите «QUIC_SESSION» в списке и найдите QUIC_SESSION_PUSH_PROMISE_RECEIVED - если есть совпадения, вы точно знаете, что файлы выдвигаются.

Нужно немного разобраться, толкнул ли он в данный момент, и путаница в основном связана с тем, что Chrome Dev Tools на самом деле не согласованы между протоколами и версиями.

...