概述参数顺序、大小写与无关参数会影响命中。本文示例统一标准化处理。正规化示例function normalize(url) {
const u = new URL(url);
u.searchParams.sort();
u.hash = '';
// 可过滤无关参数,如 utm_*
for (const k of Array.from(u.searchParams.keys())) {
if (k.startsWith('utm_')) u.searchParams.delete(k);
}
return u.origin + u.pathname + (u.search ? '?' + u.searchParams.toString() : '');
}
self.addEventListener('fetch', event => {
const keyUrl = normalize(event.request.url);
event.respondWith((async () => {
const cache = await caches.open('norm-v1');
const key = new Request(keyUrl, { headers: event.request.headers });
const cached = await cache.match(key);
if (cached) return cached;
const res = await fetch(event.request);
await cache.put(key, res.clone());
return res;
})());
});

发表评论 取消回复