From 92ade10a37687858b0210fd4a7c17695da662b51 Mon Sep 17 00:00:00 2001 From: Thomas Hackner Date: Tue, 14 Jul 2026 12:33:07 +0200 Subject: [PATCH] Statische Dateien: JS/CSS revalidieren statt blind cachen express.static setzte kein Cache-Control, also legte der Browser die Lebensdauer selbst fest (heuristisch, aus dem Alter der Datei). Folge: nach einem Deploy lief die Oberflaeche im offenen Tab weiter mit dem alten chat.js - die frisch ausgelieferten Tabellen wurden dort weiter als Pipe-Wueste gerendert, obwohl der Server die neue Datei schon hatte. no-cache heisst nicht "nicht cachen": der Browser behaelt die Datei, fragt aber per ETag nach, ob sie noch gilt (304, kein erneuter Download). Co-Authored-By: Claude Opus 4.8 --- server.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/server.js b/server.js index cfee9dc..ea019c1 100644 --- a/server.js +++ b/server.js @@ -135,7 +135,16 @@ app.locals.safeUrl = function (url) { // Middleware app.use(express.json({ limit: '2mb' })); app.use(express.urlencoded({ extended: true, limit: '2mb' })); -app.use(express.static(path.join(__dirname, 'public'))); +// Statische Dateien. JS/CSS bekommen "no-cache": der Browser darf sie behalten, +// muss aber jedes Mal per ETag nachfragen, ob sie noch aktuell sind (304, kein +// erneuter Download). Ohne diesen Header setzt der Browser die Lebensdauer selbst +// fest — nach einem Deploy lief die Oberfläche dann noch tagelang mit dem alten +// chat.js weiter, obwohl der Server längst die neue Datei auslieferte. +app.use(express.static(path.join(__dirname, 'public'), { + setHeaders: (res, datei) => { + if (/\.(js|css)$/i.test(datei)) res.setHeader('Cache-Control', 'no-cache'); + }, +})); // Allow the browser extension (running on indeed.com) to call the import API. // Kept narrow: only the extension-facing endpoints need cross-origin access.