HTTP2 еще не поддерживает etags? - PullRequest
1 голос
/ 15 мая 2019

В настоящее время я делаю сервер для динамических и статических файлов с Node. Я пытаюсь реализовать HTTP2. Что меня удивляет, так это то, что HTTP2 не поддерживает ETags!

Когда клиент отправляет заголовки для получения файла, который начинается с нажатия и который он принял, он игнорирует заголовок «IF-NONE-MATCH».

Это пустая трата времени, я не понимаю причину такого поведения. Это тот случай или я что-то упустил?

1 Ответ

0 голосов
/ 16 мая 2019

Как обсуждалось в комментариях, сервер отправляет ресурс, поэтому клиентский запрос отсутствует, поэтому нет и Etag для отправки.

Так что HTTP / 2 поддерживает Etags - они просто не имеют никакого отношения к pushзапросы.

И да, это означает, что кэшированные ресурсы игнорируются для ресурсов с принудительной рассылкой, что является одним из больших недостатков Push и почему многие люди не рекомендуют его использовать.Когда клиент видит PUSH_PROMISE, который сервер отправляет перед отправкой ресурса, он может отклонить его с помощью запроса RST_STREAM, но к тому времени, когда он часто попадает на сервер, хорошая часть (если не вся) ресурса уже будет передана..

Есть несколько способов обойти это:

  1. Вы можете отследить то, что уже было отправлено, например, с помощью файлов cookie.У меня есть простой пример конфигурации Apache: https://www.tunetheweb.com/performance/http2/http2-push/. Конечно, предполагается, что куки и кеш синхронизированы, но могут и не быть (их можно очистить независимо).
  2. Некоторые серверы отслеживаютчто уже было вытолкнуто.Например, Apache позволяет настроить push-дневник HTTP / 2 (по умолчанию 256 элементов), который отслеживает элементы, передаваемые по этому соединению.Если вы заходите на страницу page1.html, и он отправляет файл styles.css, а затем вы посещаете страницу page2.html, и он также пытается отправить файл styles.css, Apache не будет его выдвигать, поскольку он знает, что он у вас уже есть.Однако это работает, только если вы используете то же соединение.Если позже вы вернетесь к новому соединению, но оно все еще будет в кеше, то оно будет повторно отправлено.
  3. Было выдвинуто предложение Кэш-дайджесты , которые позволяют браузеру отправлятьзакодированный список того, что находится в кэше в начале любого соединения, и сервер может использовать это, чтобы узнать, следует ли нажать на элемент или нет.Однако работа над этим была остановлена ​​ в последнее время, так как по этому поводу возникли некоторые проблемы с конфиденциальностью.

В конечном счете, использование HTTP / 2 Push оказалось довольно сложным, и его использованиеневероятно низкий из-за этого.Во многом из-за этого, но также , потому что это сложно, и есть другие проблемы с подтекстом .Даже если бы все это было решено, все равно легко перегрузить ресурсы, когда, возможно, лучше позволить браузеру запрашивать ресурсы в том порядке, в котором он знает, что они им нужны.Команда Chrome даже говорила о том, чтобы отключить его и не поддерживать.

Многие рекомендуют вместо этого использовать Ранние подсказки с кодом состояния 103 , поскольку он сообщает браузеру, что запрашивать, а непросто подталкиваю это.Затем браузер может использовать все свои обычные знания (что находится в кеше, какой приоритет должен запрашиваться ... и т. Д.) Вместо того, чтобы переопределять все это, как это делает Push.

Дешевый плагин, но если он заинтересовантогда в главе 5 моей недавно опубликованной книги обсуждается все это более подробно, чем можно втиснуть в ответ о переполнении стека.

...