Я использую сервисного работника, чтобы разрешить автономный доступ к моей странице.Я использую рабочий ящик, но я думаю, что проблема применима к работникам сферы обслуживания в целом.
Рабочий процесс для пользователя заключается в том, что он нажимает кнопку, чтобы загрузить данные для автономного использования.Это включает в себя ряд файлов, которые могут храниться или не храниться в Amazon S3.
Например, можно представить, что код, когда пользователь нажимает кнопку:
function cacheFilesForOfflineUse(files) {
files.forEach(file => fetch(file));
}
Тогдав serviceWorker.js что-то вроде:
workbox.routing.registerRoute(
({event}) => /* ... omitted ... */,
new workbox.strategies.CacheFirst({cacheName: 'myFilesCache'})
);
отвечает за перехват выборки и сохранение ее в кеше.Это, конечно, упрощенно.
В основном это работает, но для одного конкретного случая: , если файл находится за 302 Redirect (что имеет место, когда файл хранится на S3),и я пытаюсь загрузить файл (установив document.location), я получаю эту ошибку в консоли:
... перенаправленный ответ был использован для запроса, чейрежим перенаправления не «следует»
и отображается страница с ошибкой.
В есть предложение только в Chrome (Service Worker): '... aперенаправленный ответ был использован для запроса, режим перенаправления которого не «следует» ', чтобы сохранить копию ответа, когда вы получаете перенаправленный ответ, поэтому я попытался использовать эту технику в качестве плагина для рабочей панели (cleanResponse такой же, как в связанном посте):
{
cacheWillUpdate: async ({request, response, event}) => {
if (response.redirected && response.ok) {
// Sanitize redirects
for (const key of response.headers.keys()) {
console.log(key, response.headers.get(key));
}
return cleanResponse(response);
}
return response;
},
}
, который почти работает, но имеет одно большое предостережение: он не клонирует все заголовки ответа.Только зарегистрированные / скопированные заголовки:
image-image image / png последнее изменение вт, 18 июня 2019 12:57:10 GMT
, который критически пропускаетContent-Disposition: заголовок вложения, который необходим браузеру, чтобы рассматривать это как загрузку.
Есть ли способ обойти это, или я столкнулся с каким-то ограничением безопасности?