eduardweb.
DeploymentIntermediar#performance

Cum setezi Cache-Control corect pentru Next.js pe Apache (fără chunk 404)

De Eduard Negru, 21 apr. 2026 · 19 vizualizări · 3 like-uri

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ște 304 Not Modified câ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.

Răspunsuri 0

Se încarcă răspunsurile…

Loghează-te pentru a răspunde

Doar membrii comunității pot lăsa comentarii.