Работник сервиса w offline.html Страница резервного копирования - PullRequest
0 голосов
/ 03 июля 2018

Не удается отобразить страницу offline.html. Я продолжаю получать The FetchEvent for "https://my-domain.com" resulted in a network error response: a redirected response was used for a request whose redirect mode is not "follow".

Вот фрагмент моего service-worker.js, который должен возвращать offline.html, когда сеть недоступна.

self.addEventListener('fetch', function(event) {
     if (event.request.mode === 'navigate' || (event.request.method === 'GET' && event.request.headers.get('accept').includes('text/html'))) {
        if(event.request.url.includes("my-domain.com")){
            console.log(event.request);
            event.respondWith(
                caches.match(event.request).then(function(resp) {
                    return resp || fetch(event.request).then(function(response) {
                        let responseClone = response.clone();
                        caches.open(CACHE_NAME).then(function(cache) {
                            cache.put(event.request, responseClone);
                        });
                        return response;
                    });
                }).catch(function() {
                    return caches.match("/offline.html");
                })
            );            
        }
    }
});

Ниже представлен файл console.log моего сетевого запроса (обновление страницы в автономном режиме)

Request {method: "GET", url: "https://my-domain.com", headers: Headers, destination: "unknown", referrer: "", …}
bodyUsed:false
cache:"no-cache"
credentials:"include"
destination:"unknown"
headers:Headers {}
integrity:""
keepalive:false
method:"GET"
mode:"navigate"
redirect:"manual"
referrer:""
referrerPolicy:"no-referrer-when-downgrade"
signal:AbortSignal {aborted: false, onabort: null}
url:"https://my-domain.com"
__proto__:Request

1 Ответ

0 голосов
/ 03 июля 2018

Я получил это работает / нашел исправление. Это было связано с проблемой безопасности перенаправленного ответа в браузере. Из блога Chromium Bugs: Response.redirected и новое ограничение безопасности .

Решение. Чтобы избежать этой ошибки, у вас есть 2 варианта.

  1. Вы можете изменить обработчик события установки, чтобы сохранить ответ, сгенерированный из res.body:

    self.oninstall = evt => {
      evt.waitUntil(
          caches.open('cache_name')
            .then(cache => {
                return fetch('/')
                  .then(response => cache.put('/', new Response(response.body));
              }));
    };
    
  2. Или измените оба обработчика, чтобы сохранить не перенаправленный ответ, установив режим перенаправления на «ручной»:

    self.oninstall = function (evt) {
      evt.waitUntil(caches.open('cache_name').then(function (cache) {
        return Promise.all(['/', '/index.html'].map(function (url) {
          return fetch(new Request(url, { redirect: 'manual' })).then(function (res) {
            return cache.put(url, res);
          });
        }));
      }));
    };
    self.onfetch = function (evt) {
      var url = new URL(evt.request.url);
      if (url.pathname != '/' && url.pathname != '/index.html') return;
      evt.respondWith(caches.match(evt.request, { cacheName: 'cache_name' }));
    };
    
...