Директива H2PushResource не работает для отправки сервера http2 в Apache

Я использую HTTP-сервер Apache с включенным h2. H2PushResource не работает должным образом. Я хочу протестировать Server Push.

Я добавил следующие дополнительные строки конфигурации в файл httpd.conf.

Protocols h2 http/1.1
H2PushResource on
<If "%{DOCUMENT_URI} == '/testhttp2.html'">
        H2PushResource add hello3.jpg
</If>

Я не вижу PUSH для этого ресурса в поле «Инициатор» инструментов разработки Chrome.

Заголовок добавления ссылки для предварительной загрузки работает нормально. Инициатором предварительной загрузки является «Другое» (как и ожидалось).

Кроме того, может ли кто-нибудь объяснить мне HTTP2_SESSION_RECV_PUSH_PROMISE и HTTP2_SESSION_SEND_RST_STREAM? Я вижу это для проталкиваемого ресурса в chrome://net-internals/

t=62561 [st=   4]    HTTP2_SESSION_RECV_PUSH_PROMISE
                     --> :scheme: https
                         :authority: newapache.com:442
                         :path: style1.css
                         :method: GET
                         cache-control: no-cache
                         user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36
                         accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
                         accept-encoding: gzip, deflate, br
                         accept-language: en-US,en;q=0.9
                         host: newapache.com:442
                     --> id = 1
                     --> promised_stream_id = 4
t=62561 [st=   4]    HTTP2_SESSION_SEND_RST_STREAM
                     --> description = "Invalid pushed request headers."
                     --> error_code = "7 (REFUSED_STREAM)"
                     --> stream_id = 4

t=62562 [st=   5]    HTTP2_SESSION_RECV_RST_STREAM
                     --> error_code = "7 (REFUSED_STREAM)"
                     --> stream_id = 4

person priyankatanvani    schedule 25.07.2018    source источник


Ответы (1)


Вы не используете его правильно.

Эта команда:

    H2PushResource add hello3.jpg

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

    H2PushResource add /hello3.jpg

Сообщение PUSH_PROMISE — это сообщение, отправленное с сервера клиенту, в котором говорится: «Я знаю, что вы не просили об этом, но я собираюсь отправить вам этот ресурс сейчас, дайте мне знать, если это проблема». Его структура аналогична HTTP-запросу (кадр HEADER в HTTP/2), за исключением того, что он исходит от сервера, а не от клиента — это в основном поддельный запрос, на который сервер отвечает с помощью проталкиваемого ресурса.

Сообщение RST_STREAM используется для сброса потока, что означает завершение загрузки в процессе выполнения. В этом случае клиент (веб-браузер) говорит: «Мне не нужен проталкиваемый ресурс, потому что я считаю, что некоторые из заголовков недействительны, поэтому это плохой запрос, который я все равно проигнорирую». Недопустимый заголовок — это псевдозаголовок :path, который должен быть /hello3.jpg, а не hello3.jpg.

После того, как вы исправите это, вам следует знать еще о нескольких вещах:

  1. Ресурс должен использоваться страницей, иначе он будет отправлен, но не будет отображаться на вкладке «Сеть», что будет бессмысленным и расточительным толчком. Хотя это будет отображаться в chrome://net-internals.

  2. Chrome не позволяет использовать кеш (в том числе push-кэш) для небезопасных соединений (например, с самозаверяющим сертификатом, который не является доверенным). Поэтому, если в Chrome не отображается зеленый замок, отправленные ресурсы будут игнорироваться.

  3. Apache запоминает, какие ресурсы он передал в это соединение, поэтому не должен повторно отправлять их в том же соединении. Используйте эту команду, чтобы отключить эту функцию, чтобы упростить ее тестирование:

    H2PushDiarySize 0
    

Push может быть довольно сложным, поэтому ознакомьтесь с моей главой об этом в моей будущей книге для получения дополнительной информации: https://livebook.manning.com/#!/book/http2-in-action/chapter-5

person Barry Pollard    schedule 25.07.2018