fix(pwa): geaenderte Kopfzeilen erreichen den Browser wieder
Ein Eintrag im Cache ist eine ganze Antwort, mitsamt ihren Kopfzeilen. Weil index.html vorab im Cache lag und von dort auch „/" beantwortete, bekam der Browser dauerhaft die CSP von damals: eine Aenderung an HONEYBAR_ORIGIN kam nie an, denn der Inhalt der Datei aendert sich dabei nicht, und der Vorab-Cache holt nur Geaendertes nach. Sichtbar als Widerspruch, an dem nichts falsch aussah — das Skript laedt den neuen Ursprung, die CSP erlaubt den alten. Navigationen laufen jetzt Netz zuerst, Cache als Rueckfall; index.html bleibt vorab abgelegt, aber nur noch als letzte Reihe (precacheFallback). Dass sie nicht mehr als Verzeichnisseite fuer „/" einspringt, ist der eigentliche Punkt: sonst kaeme die neue Regel nie zum Zug. Nachgemessen: Wechsel des Ursprungs kommt beim zweiten Aufruf an, und offline laden „/", „/admin" und „/s/<token>" weiterhin die Anwendung. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
d6b9d6a1ce
commit
3d9a4832f9
1 file changed
+48
-8
+48
-8
@@ -40,14 +40,54 @@ export default defineConfig({
|
||||
VitePWA({
|
||||
registerType: 'autoUpdate',
|
||||
workbox: {
|
||||
// Der Service Worker beantwortet jede Navigation aus dem Cache mit
|
||||
// index.html – nötig, damit Adressen wie /admin oder /s/<token> auch
|
||||
// offline funktionieren. Ohne diese Ausnahmen erwischt er aber auch
|
||||
// Downloads: Ein Klick auf „Download" öffnet eine Navigation zu
|
||||
// /api/v1/files/<id>/download, der Worker liefert die Anwendung statt
|
||||
// der Datei, und es passiert sichtbar nichts.
|
||||
navigateFallback: 'index.html',
|
||||
navigateFallbackDenylist: [/^\/api\//, /^\/dav\//, /^\/share\//, /^\/branding\//, /^\/wopi\//],
|
||||
// Der Service Worker beantwortet Navigationen — also den Aufruf der
|
||||
// Seite selbst — **Netz zuerst, Cache als Rueckfall**.
|
||||
//
|
||||
// Frueher lag index.html im Vorab-Cache und wurde von dort geliefert.
|
||||
// Das war schnell, hatte aber eine unscheinbare Folge: Ein Eintrag im
|
||||
// Cache ist eine ganze Antwort, **mitsamt ihren Kopfzeilen**. Der
|
||||
// Browser bekam also dauerhaft die CSP von damals. Eine Aenderung an
|
||||
// HONEYBAR_ORIGIN erreichte ihn nie — der Inhalt der Datei aendert sich
|
||||
// ja nicht, und der Vorab-Cache holt nur nach, was sich geaendert hat.
|
||||
// Sichtbar wurde das als Widerspruch, an dem nichts falsch aussah: Das
|
||||
// Skript laedt den neuen Ursprung, die CSP erlaubt den alten.
|
||||
//
|
||||
// precacheFallback haelt dabei, was navigateFallback vorher leistete:
|
||||
// Ist weder Netz noch Cache da, antwortet die vorab abgelegte
|
||||
// index.html — Adressen wie /admin oder /s/<token> funktionieren also
|
||||
// weiterhin offline.
|
||||
//
|
||||
// Ausgenommen sind Downloads und WebDAV: Ein Klick auf „Download"
|
||||
// oeffnet eine Navigation zu /api/v1/files/<id>/download. Faengt der
|
||||
// Worker die ab, liefert er die Anwendung statt der Datei — und es
|
||||
// passiert sichtbar nichts. Sie sollen am Worker vorbeigehen, nicht
|
||||
// von ihm beantwortet werden.
|
||||
// Der Vorab-Cache beantwortet sonst auch den Aufruf von „/" — er
|
||||
// rechnet index.html als Verzeichnisseite an. Genau daran scheiterte
|
||||
// der erste Anlauf: Die Regel unten kam nie zum Zug, weil die Seite
|
||||
// schon vorher aus dem Vorab-Cache beantwortet wurde, mitsamt alter
|
||||
// CSP. Als reiner Rueckfall (precacheFallback) bleibt index.html dort
|
||||
// liegen, nur eben nicht mehr als Antwort auf jede Navigation.
|
||||
directoryIndex: null,
|
||||
// vite-plugin-pwa setzt sonst von sich aus navigateFallback: 'index.html'
|
||||
// — also genau die Vorab-Cache-Antwort, die wir hier los sein wollen.
|
||||
// Die Sperrliste nimmt jede Adresse davon aus; zustaendig ist dann die
|
||||
// Regel darunter.
|
||||
navigateFallbackDenylist: [/./],
|
||||
runtimeCaching: [
|
||||
{
|
||||
urlPattern: ({ request, url }) =>
|
||||
request.mode === 'navigate' &&
|
||||
!/^\/(api|dav|share|branding|wopi)\//.test(url.pathname),
|
||||
handler: 'NetworkFirst',
|
||||
options: {
|
||||
cacheName: 'aether-seiten',
|
||||
// Ohne Grenze haengt der Start am langsamsten Netz.
|
||||
networkTimeoutSeconds: 3,
|
||||
precacheFallback: { fallbackURL: 'index.html' },
|
||||
},
|
||||
},
|
||||
],
|
||||
// PDF.js bleibt aussen vor: Betrachter (435 KB), Arbeiter (1,3 MB)
|
||||
// und Standardschriften (800 KB) sind zusammen zweieinhalb Megabyte,
|
||||
// die nur braucht, wer ein PDF oeffnet. Vorab in den Cache zu legen
|
||||
|
||||
Reference in new issue
Block a user