diff --git a/server/index.mjs b/server/index.mjs index 23bcf7e..5758c12 100644 --- a/server/index.mjs +++ b/server/index.mjs @@ -3937,7 +3937,12 @@ app.use(express.static(staticDir, { index: 'index.html', setHeaders: (res, filePath) => { try { - if (String(filePath || '').toLowerCase().endsWith('.html')) { + // index.html ET index.css sont les SEULS fichiers non fingerprintés + // (index.html référence /index.css en dur). Avec maxAge 1h, F5 leur + // laissait l'ANCIEN fichier jusqu'à une heure après un redéploiement — + // d'où « je ne vois pas le correctif » alors que le serveur est à jour. + const name = path.basename(String(filePath || '')).toLowerCase(); + if (name === 'index.html' || name === 'index.css') { res.setHeader('Cache-Control', 'no-cache, no-store, must-revalidate'); res.setHeader('Pragma', 'no-cache'); res.removeHeader('Expires'); diff --git a/server/tests/api_coverage.test.mjs b/server/tests/api_coverage.test.mjs index 433f20c..857220a 100644 --- a/server/tests/api_coverage.test.mjs +++ b/server/tests/api_coverage.test.mjs @@ -235,6 +235,21 @@ describe('production-ready (P0/P1)', () => { } }); + it('index.html et index.css : jamais mis en cache (seuls fichiers non fingerprintés)', async () => { + for (const p of ['/', '/index.css']) { + const r = await fetch(`${base}${p}`); + assert.equal(r.status, 200, p); + const cc = r.headers.get('cache-control') || ''; + // Sans revalidation, F5 continue de servir l'ANCIEN fichier jusqu'à 1 h + // après un redéploiement : le correctif est bien sur le serveur mais + // invisible au navigateur. + assert.match(cc, /no-cache/, `${p} doit être revalidé à chaque chargement (reçu : ${cc || 'vide'})`); + assert.ok(!/max-age=[1-9]/.test(cc), `${p} ne doit pas porter de max-age positif (${cc})`); + } + const css = await fetch(`${base}/index.css`); + assert.match(css.headers.get('content-type') || '', /css/, '/index.css doit servir du CSS'); + }); + it('X-Request-Id renvoyé sur chaque réponse', async () => { const r = await fetch(`${base}/api/health`); assert.ok(r.headers.get('x-request-id'), 'header X-Request-Id absent');