Кэширование и GZip на GAE (Community Wiki) - PullRequest
15 голосов
/ 12 февраля 2011

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

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

1 Ответ

15 голосов
/ 12 февраля 2011

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

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

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

  • Ваши конечные пользователи получат последние копии ваших ресурсов, даже если у них будет то же имя (в отличие от истечения срока давности).Это хорошо .
  • Однако вашим конечным пользователям все равно придется сделать запрос, чтобы проверить состояние этого файла.Это замедляет работу вашего сайта и «накладные расходы», когда содержание не изменилось.Это не идеально.

Выбор срока действия кэша в далеком будущем вместо (просто) etag

Для использования дат срока действия в далеком будущем требуется двашаги и немного понимания.

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

  2. Сконфигурируйте GAE, чтобы установить желаемое время истечения с помощью default_expiration и /или expiration в app.yaml. Документы GAE для статических файлов

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

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

Когда GAE gzip?

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

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

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

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

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

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