gpt4 book ai didi

javascript - Service Worker 破坏 301 重定向

转载 作者:搜寻专家 更新时间:2023-11-01 04:29:41 24 4
gpt4 key购买 nike

我在 WordPress 网站上使用 service worker,它弄乱了来自 https://example.com/page 的重定向至 https://example.com/page/ .

第一次加载后,转到没有尾部斜杠的 URL 闪烁浏览器显示“无法访问此站点”,而 Firefox 显示“内容损坏错误”。

根据我对 https://medium.com/@boopathi/service-workers-gotchas-44bec65eab3f#.hf3r4pbcs 的阅读和 How to alter the headers of a Request?认为我必须检测响应何时为 3xx 并将重定向模式设置为手动。

但是,根据我的研究,我尝试过的任何方法都没有奏效。我该如何解决这个问题?

当前服务 worker 文件:

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 应该能够得到正确的响应。

但如果您想手动处理 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);
}
})
);
}

在干净的状态下尝试此操作,清除您的缓存和预安装的 Service Worker。

关于javascript - Service Worker 破坏 301 重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40476938/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com