Кэширование и GZip в GAE (Community Wiki)

Почему Google App Engine не устанавливает подходящие заголовки, подобные кешам (например, даты дат будущего) в моих стилях CSS и файлах JavaScript? Когда GAE gzip эти файлы? Мой app.yaml обозначает соответствующие каталоги как static_dir s, поэтому отсутствие дат истечения далекого будущего выглядит для меня чем-то неожиданным.

Это вики сообщества, чтобы продемонстрировать лучшие практики в отношении статического кэширования файлов и gzipping на GAE!

Ответы

Ответ 1

Как GAE обрабатывает кеширование?

Кажется, что GAE устанавливает время истечения срока действия кеша будущего, но использует заголовок etag. Это используется, поэтому браузеры могут спросить: "Сменился ли этот файл с тех пор, как он имел etag от X68f0o?"? и услышать "Nope - 304 Not Modified" в ответ.

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

  • Конечные пользователи получат последние копии ваших ресурсов, даже если они имеют одинаковое имя (в отличие от истечения срока действия в будущем). Это хороший.
  • Тем не менее, конечным пользователям все равно придется сделать запрос для проверки состояния этого файла. Это замедляет работу вашего сайта и является "чистым накладным", когда контент не изменился. Это не идеально.

Оптимизация срока действия кэша в будущем будущем вместо (просто) etag

Чтобы использовать даты дат будущего, требуется два шага и немного понимания.

  • Вам необходимо вручную обновить приложение, чтобы запросить новые версии ресурсов, например. именования файлов, таких как mysitesstyles.2011-02-11T0411.css вместо mysitestyles.css. Есть инструменты, помогающие автоматизировать это, но Im не знают о том, что напрямую связано с GAE.

  • Настройте GAE, чтобы установить время истечения, которое вы хотите, используя default_expiration и/или expiration в app.yaml. GAE docs для статических файлов

Третий вариант: манифест приложений

Ярлыки кэша - это функция HTML5, которая переопределяет заголовки кешей. статья MDN, DiveIntoHTML5, W3C. Однако это влияет не только на кеширование script и файлов стилей. Используйте с осторожностью!

Когда GAE gzip?

В соответствии с Часто задаваемые вопросы в Google > ,

Google App Engine делает все возможное, чтобы обслуживать gzipped-контент для браузеров, которые его поддерживают. Использование этой схемы является автоматическим и не требует изменений в приложениях.

Мы используем комбинацию заголовков запросов (Accept-Encoding, User-Agent) и заголовков ответов (Content-Type), чтобы определить, может ли конечный пользователь использовать преимущества gzipped-контента. Такой подход позволяет избежать некоторых известных ошибок с gzipped-контентом в популярных браузерах. Чтобы заставить обслуживаемый gzip-контент обслуживаться, клиенты могут предоставлять "gzip" в качестве значения заголовков запросов Accept-Encoding и User-Agent. Содержимое никогда не будет gzipped, если нет заголовка Accept-Encoding.

Это описано далее в документации среды выполнения (Java Python).

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

  • GAE gzips актуальные страницы (если у них есть соответствующие content-type заголовки, такие как text/html; charset=utf-8)
  • GAE gzips скрипты и стили в static_dir (определены в app.yaml).
  • Обратите внимание, что вы не должны ожидать, что GAE будет gzip-изображениями, такими как GIF или JPEG, поскольку они уже сжаты.