服务工作者打破301重定向 [英] Service Worker breaking 301 redirects

查看:78
本文介绍了服务工作者打破301重定向的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在WordPress网站上使用服务工作者,它正在搞乱 https://example.com的重定向/ page https://example.com/page/

I'm using a service worker on a WordPress site and it's messing up the redirections from https://example.com/page to https://example.com/page/.

第一次加载后,转到不带斜线斜线的URL Blink浏览器说无法访问此站点,Firefox说内容错误已损坏。

After the first load, going to the URL without the trailing slash Blink browsers say "This site can't be reached" and Firefox says "Corrupted content error".

根据我对 https的解读: //medium.com/@boopathi/service-workers-gotchas-44bec65eab3f#.hf3r4pbcs 如何更改请求的标头?认为我必须检测响应是3xx并将重定向模式设置为手动。

Based on my reading of https://medium.com/@boopathi/service-workers-gotchas-44bec65eab3f#.hf3r4pbcs and How to alter the headers of a Request? I think I have to detect when a response is 3xx and set the redirect mode to manual.

然而根据我的研究我没有尝试过工作。我该如何解决这个问题?

However nothing I've tried based on my research has worked. How do I fix this?

当前服务工作者文件:

var cacheName = 'v14';

var urlsToCache = [
  // list of URLs to precache
];

self.addEventListener('install', event => {

  function onInstall(event) {
    return caches.open(cacheName)
      .then(cache => cache.addAll(urlsToCache));
  }

  event.waitUntil(
    onInstall(event)
      .then(() => self.skipWaiting())
  );

});

self.addEventListener('activate', event => {

  function onActivate (event) {
    return caches.keys()
      .then(cacheKeys => {
        var oldCacheKeys = cacheKeys.filter(key => key.indexOf(cacheName) !== 0);
        var deletePromises = oldCacheKeys.map(oldKey => caches.delete(oldKey));
        return Promise.all(deletePromises);
      })
  }

  event.waitUntil(
    onActivate(event)
      .then(() => self.clients.claim ())
  );
});

self.addEventListener('fetch', event => {

  function onFetch (event) {
    // Let's not interfere with requests for stuff that doesn't need to be cached
    // or could prevent access to admin if it is
    if (event.request.url.match(/wp-admin/) || event.request.url.match(/wp-login/) || event.request.url.match(/preview=true/) || event.request.url.match(/wp-includes/) || event.request.url.match(/plugins/) || event.request.url.match(/google-analytics/) || event.request.url.match(/gravatar\.com/) || event.request.url.match(/login/) || event.request.url.match(/admin/) || event.request.method !== 'GET') {
      return;
    }

    // Determine type of asset
    var request = event.request,
        acceptHeader = request.headers.get('Accept'),
        resourceType = 'static';

    if(acceptHeader.indexOf('text/html') !== -1) {
      resourceType = 'content';
    } else if(acceptHeader.indexOf('image') !== -1) {
      resourceType = 'image';
    }

    // Network first for HTML and images
    if(resourceType === 'content') {
      event.respondWith(fetch(request.url, {
        method: request.method,
        headers: request.headers,
        mode: 'same-origin', // need to set this properly
        credentials: request.credentials,
        redirect: 'manual'
      })
        .then(response => addToCache(request, response)) // read through caching
        .catch(() => fetchFromCache(event))
        .catch(() => offlineResponse(resourceType))
      )
    }

    // Cache first for static assets
    else if(resourceType === 'static' || resourceType === 'image') {
      event.respondWith(fetchFromCache(event)
        .catch(() => fetch(request))
        .then(response => addToCache(request, response))
        .catch(() => offlineResponse(resourceType))
      )
    }
  }

  onFetch(event);

});

function addToCache(request, response) {

  if(response.ok) { // only 200s
    var copy = response.clone(); // Because responses can only be used once
    caches.open(cacheName)
      .then(cache => {
        cache.put(request, copy);
      });

    return response;
  }

}

function fetchFromCache (event) {

  return caches.match(event.request)
    .then(response => {
      if(!response) {
        // A synchronous error that will kick off the catch handler
        throw Error('${event.request.url} not found in cache');
      }
    return response;
  });

}

function offlineResponse (resourceType) {

  if(resourceType === 'content') {
    return caches.match('/offline/');
  }
  return undefined;

}


推荐答案

你不要不需要做任何事情来遵循重定向。如果请求 some / url 并被重定向到 some / url / ,serviceo worker应该能够得到正确的响应。

You don't need to do anything to follow redirects. If requesting some/url and being redirected to some/url/ the serviceo worker should be able to get the proper response.

但如果您想手动处理3XX答案,您可以这样做:

But if you want to manually handle the 3XX answer you can do:

self.onfetch = function (event) {
  var dontFollowRedirects = new Request(event.request.url, { redirect: 'manual' });
  event.respondWith(fetch(dontFollowRedirects)
    .then(function (response) {
      if (response.status >= 300 && response.status < 400) {
        return doSomethingWithRedirection(response);
      }
    })
  );
}

在干净状态下尝试此操作,擦除缓存并预安装服务工人。

Try this on a clean state, wiping out your caches and pre-installed Service Workers.

这篇关于服务工作者打破301重定向的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆