Заголовки CORS (Cross-Origin Resource Sharing) играют критическую
роль в взаимодействии браузеров с ресурсами, расположенными на разных
доменах. Они определяют, каким источникам разрешено получать доступ к
ресурсам и как браузер должен обрабатывать такие запросы. Для
правильного кэширования ресурсов важна корректная настройка этих
заголовков, поскольку они напрямую влияют на поведение Service Worker и
библиотек вроде sw-precache.
Ключевые заголовки:
Access-Control-Allow-Origin —
указывает, какие домены могут обращаться к ресурсу. Значение
* позволяет доступ всем источникам.Access-Control-Allow-Methods — список
HTTP-методов, разрешённых для запросов.Access-Control-Allow-Headers —
перечень заголовков, которые могут быть использованы клиентом.Access-Control-Allow-Credentials —
разрешение передачи учётных данных, таких как куки или
HTTP-авторизация.Важно понимать, что браузер блокирует кэширование ответов с
неправильными CORS-заголовками при использовании Service Worker. Даже
если ресурс доступен по сети, без корректного
Access-Control-Allow-Origin Service Worker не сможет его
закэшировать.
Service Worker кэширует ресурсы, опираясь на ответ сервера. Если запрос к стороннему ресурсу не содержит корректного CORS-заголовка, браузер интерпретирует ответ как “opaque response”, что накладывает ограничения:
sw-precache не сможет корректно определять изменения
ресурса, что может приводить к устаревшим версиям в кэше.Для ресурсов, к которым планируется полноценный доступ и кэширование, необходимо, чтобы сервер возвращал:
Access-Control-Allow-Origin: *
или конкретный домен, с которого происходит запрос. Это позволяет
sw-precache корректно инжектировать такие файлы в
precache-манифест и управлять их версионированием.
Библиотека sw-precache позволяет гибко управлять
кэшированием ресурсов, включая сторонние. Основные моменты
настройки:
importScripts и сторонние ресурсы
При использовании сторонних скриптов через importScripts
нужно учитывать, что они должны быть доступны с корректным
CORS-заголовком. В противном случае Service Worker не сможет их
выполнить.
Опция handleFetch и CORS При
генерации Service Worker с sw-precache можно включить
обработку fetch-запросов:
handleFetch: true
Это позволяет кэшировать запросы к сторонним ресурсам, но только если
сервер отвечает с допустимым
Access-Control-Allow-Origin.
Фильтрация ресурсов через
staticFileGlobs Для сторонних ресурсов можно
указать URL напрямую и задать cacheId и
stripPrefix. Пример:
staticFileGlobs: [
'https://cdn.example.com/library.js'
],
runtimeCaching: [{
urlPattern: /^https:\/\/cdn\.example\.com\//,
handler: 'cacheFirst'
}]
При этом CDN должен отдавать корректный CORS-заголовок. Иначе кэширование будет только “opaque”.
*, если передаются
учётные данные (credentials: include).Access-Control-Allow-Origin: *.runtimeCaching для динамических ресурсов,
чтобы иметь возможность обновлять кэшированные файлы корректно.Корректная работа CORS заголовков позволяет sw-precache
максимально эффективно кэшировать ресурсы и избегать проблем с
устаревшими или заблокированными данными.