Postat acum 1 zi
apacheconf
# /etc/apache2/sites-available/yoursite-le-ssl.conf
<IfModule mod_headers.c>
# HTML: force revalidation (ETag returns 304 when unchanged)
Header always unset Cache-Control
Header always set Cache-Control "public, max-age=0, must-revalidate"
</IfModule>
# Static assets (content-hashed) — cache 1 year
<LocationMatch "^/_next/static/">
Header always unset Cache-Control
Header always set Cache-Control "public, max-age=31536000, immutable"
</LocationMatch>Problema
După ce dai deploy la un site Next.js (App Router) pe un server Apache (reverse proxy către pm2), utilizatorii primesc erori 404 pentru fișiere _next/static/chunks/*.js.
Cauza: browserul are cached HTML-ul vechi (Next.js trimite default Cache-Control: public, max-age=3600) care referă chunk-uri ce nu mai există pe server după noul build.
Soluția
Forțezi Apache să trimită Cache-Control corect pentru fiecare tip de resursă:
- HTML:
max-age=0, must-revalidate→ browserul revalidează cu serverul de fiecare dată (primește304 Not Modifiedcând nu s-a schimbat nimic, mulțumită ETag) - Static assets:
max-age=31536000, immutable→ content-addressed (hash în nume de fișier) deci e safe să le cache-uiești pentru totdeauna
Verificare
curl -sI https://eduardweb.ro/preturi | grep -i cache-control
# → cache-control: public, max-age=0, must-revalidate
curl -sI https://eduardweb.ro/_next/static/css/xxx.css | grep -i cache-control
# → cache-control: public, max-age=31536000, immutable
După asta, deploy-urile viitoare sunt invizibile pentru utilizatori — zero 404-uri, zero hard refresh-uri.