当前位置: 首页 > 知识库问答 >
问题:

服务工作者打破301重定向

胡致远
2023-03-14

我在一个WordPress网站上使用一个服务人员,它把网站的重定向弄得一团糟https://example.com/page到https://example.com/page/.

第一次加载后,转到没有尾随斜杠的网址,眨眼浏览器会说“无法访问此网站”,火狐会说“损坏的内容错误”。

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

然而,根据我的研究,我没有尝试过任何方法。我该怎么解决这个问题?

当前服务工作人员文件:

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;

}

共有2个答案

廉展鹏
2023-03-14

当遇到特定网站的错误时,我建议先清除您的浏览器缓存并删除您为该网站保存的cookie。损坏的内容错误可能是由服务器中运行过时的软件引起的。

关于服务工作者,需要注意的是,它是一个JavaScript工作者。因此,它不能直接访问DOM。相反,服务工作者可以通过响应通过postMessage发送的消息来与其控制的页面进行通信。

那博瀚
2023-03-14

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

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

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);
      }
    })
  );
}

在干净的状态下尝试此操作,清除缓存和预安装的服务人员。

 类似资料:
  • 我开始使用ExoPlayer来传输一些音频。一切都很好,直到我遇到一个URL,其中有一个“301永久移动”重定向。默认情况下,ExoPlayer2不会处理该问题。 我已经看过这个帖子了:https://github.com/google/ExoPlayer/issues/423 在那里,他们说要向HttpDataSource或UriDataSource添加新的“lowCrossDomainReDi

  • 一旦安装了Service Worker,Chrome浏览器需要多长时间来检查它的更新版本?当前客户端服务工作人员通常什么时候到期? 我正试图找出与服务人员一起开发并将更改推送到prod的最佳实践。目前,一旦对服务人员的行为方式实施了更改,如果已经安装了以前的服务人员,则客户机并不总是会接受该更改。 这个问题也有一定的相关性:以编程方式更新服务工作人员——理想情况下,一旦对SW实现了更改,您会希望在

  • 我注意到,当服务工作人员脚本本身加载到浏览器中时,不再触发服务工作人员的读取事件。例如,当我们有一个新版本的服务辅助角色时,旧的服务辅助角色读取事件不会被触发。因此,旧的服务工作者不能再检查新服务工作者的内容。 我确信这以前是可能的,我想知道这是否是一个bug,或者是否对此进行了任何更改。我在官方存储库或W3C草稿中没有找到与此更改相关的任何内容。 为了验证fetch事件没有被触发,我用版本号(参

  • 问题内容: 从我的根目录删除后,Chrome仍然运行我从Webroot中删除的服务工作者。如何从我的网站和Chrome卸载服务工作者,以便可以重新登录我的网站? 我已将问题归结为ServiceWork的缓存机制,我只想暂时将其删除,直到有时间对其进行调试为止。我正在使用的登录脚本将重定向到Google的服务器,以便他们登录其Google帐户。但是,我从login.php页面获得的只是一条消息。 问

  • 从根目录中删除后,Chrome仍然运行我从webroot中删除的服务工作者。我如何从我的网站和Chrome卸载服务工作者,以便我可以重新登录到我的网站? 我已经将问题追溯到Service Work的缓存机制,我现在只想删除它,直到我有时间调试它。我正在使用的登录脚本重定向到谷歌的服务器,以便他们登录到他们的谷歌帐户。但是我从login.php页面得到的只是一条消息。

  • 我想知道301和307重定向之间的区别。 我希望通过自制url重定向器生成反向链接,我希望任何“链接果汁”或“页面排名果汁”都能直接从原始主页流向最终url,但如果其中一个原始主页出现问题,我希望能够通过删除该特定页面的重定向链接来关闭该链接。有道理? 我的理解是,301是永久性的,这意味着谷歌将看到301并更新其缓存的URL作为最终目的地,而不管我以后是否取消重定向。 如果我使用307,它将不会