Я пытаюсь кэшировать HTML-файл из динамического php-файла при входе в систему (с помощью cookie-файла сеанса), но html-файл извлекается с сервера без учетных данных из cookie-файла сеанса. (Я не указываю имя файла в URL только путь)
let cacheName = 'q2';
let files = [
'/q/',
'/q/sw.js',
'/q/js/main.js',
'/q/js/init.js',
'/q/js/lib.js',
'/q/css/css.css',
'/q/images/b.jpg',
'/q/apps/BOK/js/main.js'
];self.addEventListener('install', (event) => {
event.waitUntil(
caches.open(cacheName)
.then((cache) => {
return cache.addAll(files)
.then(() => {
console.info('All files are cached');
return self.skipWaiting();
})
.catch((error) => {
console.error('Failed to cache', error);
});
})
);
});
(Я опустил self.addEventListener («fetch», функция (событие))
Когда я смотрю на текстовый / html файл из ‘/ q /, сервисный работник получил его с сервера без cookie-файла php-сеанса PHPSESSID, и поэтому содержимое неверно.
(В противном случае он отлично работает в автономном режиме)
Есть ли этому решение?
Такое поведение объясняется в Получить API спецификацию.
HTTP-куки (и некоторые другие вещи) называются «полномочия».
Включены ли учетные данные в исходящий HTTP-запрос или нет, определяется значением credentials
имущество из Request
объект. По умолчанию, credentials
установлен в 'omit'
, что приводит к поведению, которое вы видите. Если вы хотите, чтобы учетные данные, такие как файлы cookie HTTP, были включены, вам нужно использовать Request
объекты, чьи credentials
свойства установлены в 'include'
,
Для этого вместо передачи массива строк cache.addAll()
, вы должны передать в массиве Request
объекты с надлежащим credentials
режим явно установлен. Вот как изменится ваш код:
const requestsWithCredentials = [
'/q/',
'/q/sw.js',
'/q/js/main.js',
'/q/js/init.js',
'/q/js/lib.js',
'/q/css/css.css',
'/q/images/b.jpg',
'/q/apps/BOK/js/main.js'
].map(url => new Request(url, {credentials: 'include'}));
// Later...
cache.addAll(requestsWithCredentials);
Других решений пока нет …