Firebase Hosting использует мощный глобальный CDN, чтобы сделать ваш сайт максимально быстрым.
Любой запрошенный статический контент автоматически кэшируется в CDN . Если вы повторно развертываете контент своего сайта, Firebase Hosting автоматически очищает весь кэшированный контент в CDN до следующего запроса.
Однако поскольку Cloud Functions и службы Cloud Run генерируют контент динамически, контент для данного URL-адреса может варьироваться в зависимости от таких факторов, как вводимые пользователем данные или личность пользователя. По этой причине запросы, обрабатываемые серверным кодом, по умолчанию не кэшируются в CDN.
Однако вы можете настроить поведение кэширования для динамического контента . Например, если функция генерирует новый контент только периодически, вы можете ускорить работу своего приложения, кэшируя сгенерированный контент хотя бы на короткий период времени.
Аналогичным образом можно настроить поведение кэширования, чтобы потенциально снизить затраты на выполнение функций, поскольку контент обслуживается из CDN, а не из запускаемой функции. Подробнее об оптимизации выполнения функций и сервисов читайте в документации Cloud Functions и Cloud Run .
Исключением являются запросы, возвращающие ошибку 404. CDN кэширует ответ 404 вашей службы на несуществующий URL-адрес в течение 10 минут, чтобы последующие запросы к этому URL-адресу обслуживались из CDN. Если вы измените свою службу так, что контент теперь будет существовать по этому URL-адресу, CDN продолжит обслуживать любые кэшированные ошибки 404 в течение 10 минут (максимум), а затем нормально обслуживать контент с этого URL-адреса.
Если ответ 404 уже содержит заголовки кэширования, установленные вашей службой Cloud Functions или Cloud Run , они переопределяют значение по умолчанию, равное 10 минутам, и полностью определяют поведение кэширования CDN.
Подробную информацию о поведении кэширования можно найти в документации Google для веб-разработчиков .
Установите Cache-Control
Основным инструментом, который вы используете для управления кешем динамического контента, является заголовок Cache-Control
. Настроив этот заголовок, вы можете сообщить браузеру и CDN, как долго ваш контент может быть кэширован. В вашей функции вы устанавливаете Cache-Control
следующим образом:
res.set('Cache-Control', 'public, max-age=300, s-maxage=600');
В этом примере заголовка директивы выполняют три действия:
public
— помечает кэш какpublic
. Это означает, что как браузер, так и промежуточные серверы (то есть CDN для Firebase Hosting ) могут кэшировать контент.max-age
— сообщает браузеру и CDN, сколько секунд они могут кэшировать контент. По истечении установленного времени браузер и CDN должны повторно проверить содержимое на исходном сервере. В заголовке примера мы разрешаем браузеру и CDN кэшировать контент в течение пяти минут (конкретные элементы управления кэшированием CDN см. в разделеs-maxage
ниже).s-maxage
— переопределяет директивуmax-age
только для кэширования CDN; сообщает CDN, сколько секунд он может кэшировать контент. По истечении установленного времени CDN должна повторно проверить контент на исходном сервере. В заголовке примера мы переопределяем настройкуmax-age
только для CDN и разрешаем CDN кэшировать контент в течение десяти минут.
Для max-age
и s-maxage
установите значения на максимально длительный период времени, в течение которого пользователи будут получать устаревший контент. Если страница меняется каждые несколько секунд, используйте небольшое значение времени. Однако другие типы контента можно безопасно кэшировать на часы, дни или даже месяцы.
Вы можете узнать больше о заголовке Cache-Control
в сети разработчиков Mozilla и в документации веб-разработчиков Google.
Когда обслуживается кэшированный контент?
Браузер и CDN кэшируют ваш контент на основе:
- Имя хоста
- Путь
- Строка запроса
- Содержимое заголовков запроса, указанное в заголовке
Vary
.
Меняйте заголовки
Заголовок Vary
определяет, какие заголовки запроса следует использовать для предоставления соответствующего ответа (действителен ли кэшированный контент или контент должен быть повторно проверен на исходном сервере).
Firebase Hosting автоматически устанавливает соответствующий заголовок Vary
в вашем ответе для распространенных ситуаций. В большинстве случаев вам не нужно беспокоиться о заголовке Vary
. Однако в некоторых сложных случаях использования у вас могут быть другие заголовки, которые вам нужны для воздействия на кеш. В этом случае вы можете установить заголовок Vary
в своем ответе. Например:
res.set('Vary', 'Accept-Encoding, X-My-Custom-Header');
В этом случае значение заголовка Vary
равно:
vary: X-My-Custom-Header, x-fh-requested-host, accept-encoding, cookie, authorization
При таких настройках два идентичных запроса с разными заголовками X-My-Custom-Header
кэшируются отдельно. Обратите внимание, что Hosting добавляет Cookie
и Authorization
в заголовок Vary
по умолчанию, когда делается запрос на динамический контент. Это гарантирует, что любой используемый вами заголовок авторизации сеанса или файла cookie станет частью ключа кэша, что предотвращает случайную утечку контента.
Также обратите внимание:
Кэшироваться могут только запросы
GET
иHEAD
. HTTPS-запросы, использующие другие методы, никогда не кэшируются.Будьте осторожны при добавлении настроек в заголовок
Vary
. Чем больше настроек вы добавите, тем меньше вероятность того, что CDN сможет обслуживать кэшированный контент. Также помните, чтоVary
основан на заголовках запросов , а не на заголовках ответов .
Использование файлов cookie
При использовании Firebase Hosting вместе с Cloud Functions или Cloud Run файлы cookie обычно удаляются из входящих запросов. Это необходимо для обеспечения эффективного поведения кэша CDN. Только файл cookie со специальным именем __session
может передаваться на выполнение вашего приложения.
Если файл cookie __session
присутствует, он автоматически становится частью ключа кэша, а это означает, что два пользователя с разными файлами cookie не могут получить кэшированный ответ другого. Используйте файл cookie __session
только в том случае, если ваше приложение предоставляет другой контент в зависимости от авторизации пользователя.