Dokumentacija

Predpomnite datoteke v brskalniku

Predpomnite datoteke v brskalniku

Vsaka stran naloži iste sloge, skripte, logotipe in pisave. Brez glave za predpomnjenje jih brskalnik zahteva znova ob vsakem obisku in ob vsakem kliku na naslednjo stran: več zahtevkov, počasnejše strani za povratne obiskovalce in več prometa na vašem strežniku. Glava Cache-Control brskalniku pove, da datoteko sme shraniti in jo znova uporabiti, ne da bi spraševal.

Kontrolni seznam strani pogleda do šest lastnih datotek, ki jih naloži domača stran (CSS, JavaScript in slike z istega naslova kot stran), in pričakuje, da je vsaka predpomnjena vsaj 7 dni.

Kaj šteje kot predpomnjeno

Glava na datoteki Rezultat
Cache-Control: public, max-age=31536000, immutable OK, najboljše za datoteke z zgoščeno vrednostjo v imenu
Cache-Control: max-age=2592000 (30 dni) OK
Cache-Control: max-age=604800 (7 dni) OK, najmanj
datum Expires vsaj 7 dni naprej, brez max-age OK
Cache-Control: max-age=3600 ali glave sploh ni ni predpomnjeno dovolj dolgo
Cache-Control: no-cache ali no-store ni predpomnjeno, ne glede na preostanek glave

Datotek z drugih domen (Google Fonts, CDN za skripte, oglasno omrežje) ne preverjamo: njihovih glav ne morete spremeniti. Tudi ločena poddomena, kot je static.example.com, šteje za drug naslov.

Kako dolgo je varno, je odvisno od imena datoteke:

  • Imena z zgoščeno vrednostjo (fingerprint), kot sta app-3f2a9c1d.css ali /_next/static/…, se spremenijo ob vsaki spremembi vsebine. Predpomnite jih za eno leto z immutable; nova različica je nova datoteka.
  • Imena z različico v poizvedbi, kot je style.css?ver=6.6.2 (WordPress to doda vsakemu prijavljenemu slogu in skripti), dobijo nov naslov, ko se spremeni različica teme ali vtičnika. Mesec ali več je v redu, če se različica res spremeni, ko se spremeni datoteka.
  • Navadna imena, kot je /css/style.css, po urejanju ohranijo isti naslov. Z dolgim predpomnjenjem povratni obiskovalci obdržijo staro datoteko. Tu uporabite 7 dni in v ime dodajte različico ali zgoščeno vrednost, ko lahko.
  • Slike in pisave se pod istim imenom redko spremenijo. Od 30 dni do enega leta je običajno.

Preverite sami

Izpišite datoteke, ki jih naloži domača stran, nato poglejte glave ene od njih. Namesto example.com in poti vpišite svoje:

curl -s https://example.com | grep -oE '(href|src)="[^"]+\.(css|js|png|jpe?g|webp|svg|woff2?)[^"]*"' | head -20
curl -sI https://example.com/wp-content/themes/example/style.css | grep -iE '^(cache-control|expires):'

Popravljeno pomeni, da cache-control kaže max-age=604800 ali več (ali immutable), brez no-cache ali no-store. Če drugi ukaz ne izpiše ničesar, datoteka glave za predpomnjenje sploh nima.

Kako popraviti

Glave za predpomnjenje nastavi tisto, kar datoteke streže: spletni strežnik, nadzorna plošča gostovanja, CDN ali aplikacija. Izberite, do česar imate dostop; dovolj je eno mesto.

WordPress

WordPress sam za datoteke ne pošilja glav za predpomnjenje. To naredi strežnik, nekateri vtičniki za predpomnjenje pa jih lahko nastavijo namesto vas.

  • LiteSpeed Cache (na gostovanju LiteSpeed): LiteSpeed Cache → Cache → Browser, vklopite Browser Cache in pustite privzeti TTL (eno leto). Shranite, nato Purge All.
  • WP Rocket na Apachu in LiteSpeedu pravila za predpomnjenje v brskalniku sam doda v .htaccess. Stikala zanje ni. Na nginxu strežniških pravil ne more zapisati: glejte zavihek nginx ali vprašajte ponudnika gostovanja.

Brez teh vtičnikov dodajte pravila za .htaccess iz zavihka Apache in LiteSpeed. WordPress prijavljenim CSS in JavaScript datotekam doda ?ver=, zato je zanje mesec varen. Če CSS teme urejate ročno, ne da bi spremenili različico teme, lahko obiskovalci staro datoteko vidijo, dokler traja predpomnjenje: po takih spremembah povečajte Version: v datoteki style.css teme.

cPanel

cPanel nima stikala za predpomnjenje v brskalniku. Pravila gredo v datoteko .htaccess v korenski mapi strani:

  1. Odprite Files → File Manager in pojdite v public_html (ali v mapo dodatne domene).
  2. Desno zgoraj kliknite Settings, označite Show Hidden Files (dotfiles) in shranite.
  3. Desni klik na .htaccess → Edit, na konec prilepite blok iz zavihka Apache in LiteSpeed in shranite.

Na gostovanju LiteSpeed z WordPressom lahko ista pravila namesto vas zapiše vtičnik LiteSpeed Cache (zavihek WordPress).

Plesk

V Plesku nginx običajno stoji pred Apachem in statične datoteke streže sam, zato pravilo sodi v nginx. Pojdite v Websites & Domains → example.com → Apache & nginx Settings in v Additional nginx directives dodajte:

location ~* \.(?:css|js|mjs|png|jpe?g|gif|svg|webp|avif|ico|woff2?)$ {
    expires 30d;
}

Kliknite OK; Plesk preveri sintakso in znova naloži nginx.

Če Plesk javi podvojen location, ga že določa njegova možnost Serve static files directly by nginx. V tem primeru to možnost izklopite in namesto tega uporabite pravila za .htaccess iz zavihka Apache in LiteSpeed.

nginx

Pravila dodajte v blok server { … } strani: na Debianu in Ubuntuju v /etc/nginx/sites-available/example.com, na Rocky, Alma in CentOS v /etc/nginx/conf.d/example.com.conf.

# Izhod builda z zgoščeno vrednostjo v imenu (Vite, webpack): nova različica je nova datoteka.
location /build/ {
    add_header Cache-Control "public, max-age=31536000, immutable";
}

# Vse ostalo z navadnim imenom.
location ~* \.(?:css|js|mjs)$ {
    expires 7d;
}
location ~* \.(?:png|jpe?g|gif|svg|webp|avif|ico|woff2?)$ {
    expires 30d;
}

expires pošlje tako Cache-Control: max-age=… kot Expires. /build/ zamenjajte z mapo, v katero piše vaše orodje za build.

Opozorilo: add_header znotraj location za te datoteke nadomesti vse add_header iz bloka server, tudi varnostne glave, kot je HSTS. Če glave nastavljate v server, jih ponovite tudi v tem location.

Preizkusite in uveljavite:

sudo nginx -t && sudo systemctl reload nginx

Apache in LiteSpeed

mod_expires nastavi tako Cache-Control: max-age kot Expires. To dajte v .htaccess v korenu strani ali na lastnem strežniku v virtualni gostitelj. LiteSpeed ga prebere enako.

<IfModule mod_expires.c>
    ExpiresActive On
    ExpiresByType text/css "access plus 1 month"
    ExpiresByType text/javascript "access plus 1 month"
    ExpiresByType application/javascript "access plus 1 month"
    ExpiresByType image/png "access plus 1 year"
    ExpiresByType image/jpeg "access plus 1 year"
    ExpiresByType image/gif "access plus 1 year"
    ExpiresByType image/webp "access plus 1 year"
    ExpiresByType image/avif "access plus 1 year"
    ExpiresByType image/svg+xml "access plus 1 year"
    ExpiresByType image/x-icon "access plus 1 year"
    ExpiresByType font/woff2 "access plus 1 year"
</IfModule>

Če imajo vaše CSS in JavaScript datoteke navadna imena brez različice, v teh dveh vrsticah uporabite "access plus 1 week".

Datotekam z zgoščeno vrednostjo v imenu lahko z mod_headers dodate immutable, na primer v .htaccess znotraj mape builda:

<IfModule mod_headers.c>
    Header set Cache-Control "public, max-age=31536000, immutable"
</IfModule>

Na lastnem strežniku vklopite modula in znova naložite (na Rocky, Alma in CentOS sta oba privzeto vklopljena; namesto apache2 uporabite httpd):

sudo a2enmod expires headers
sudo apachectl configtest && sudo systemctl reload apache2

Cloudflare

Če stran teče za Cloudflarom (oranžen oblaček), lahko Cloudflare podaljša čas predpomnjenja v brskalniku za datoteke, ki jih predpomni (privzeto CSS, JavaScript, slike in pisave):

  1. Odprite domeno in pojdite v Caching → Configuration.
  2. Pri Browser Cache TTL privzeta možnost Respect Existing Headers posreduje, kar pošlje vaš strežnik. Namesto nje izberite vrednost, na primer 1 month.

Z nastavljeno vrednostjo jo Cloudflare uporabi, kadar vaš strežnik pošlje krajši čas ali nobenega; daljši max-age z vašega strežnika še vedno zmaga. Za različne čase po mapah uporabite Rules → Cache Rules in v pravilu nastavite Browser TTL.

Node.js in Next.js

Next.js v produkciji /_next/static/… že streže s public, max-age=31536000, immutable. Datoteke v public/ dobijo max-age=0, zato slike in pisave tam niso predpomnjene. Zanje nastavite glavo v next.config.js:

module.exports = {
    async headers() {
        return [
            {
                source: '/images/:path*',
                headers: [{ key: 'Cache-Control', value: 'public, max-age=2592000' }],
            },
        ];
    },
};

Express z express.static:

// Izhod builda z zgoščeno vrednostjo v imenu: eno leto, immutable.
app.use('/assets', express.static('dist/assets', { maxAge: '1y', immutable: true }));

// Navadna imena: en teden.
app.use(express.static('public', { maxAge: '7d' }));

Če datoteke pred aplikacijo streže nginx, glave nastavite tam (zavihek nginx).

Laravel

Vite (npm run build) zapiše datoteke z zgoščeno vrednostjo v imenu v public/build/assets, na primer app-3f2a9c1d.css, @vite pa jih poveže. Varno jih je predpomniti za eno leto. Laravel teh datotek ne streže: streže jih spletni strežnik, zato gre glava tja.

  • nginx (Forge, Ploi, lasten strežnik): v konfiguracijo strani dodajte blok location /build/ iz zavihka nginx.
  • Apache: privzeti public/.htaccess nima pravil za predpomnjenje. Dodajte blok mod_expires iz zavihka Apache in LiteSpeed in pravilo immutable v .htaccess znotraj public/build.

Slike in druge datoteke, ki jih postavite neposredno v public/, ohranijo svoja imena. Zanje je 30 dni dobra vrednost.

IIS in ASP.NET

V datoteki web.config strani:

<configuration>
  <system.webServer>
    <staticContent>
      <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="30.00:00:00" />
    </staticContent>
  </system.webServer>
</configuration>

30.00:00:00 je 30 dni. Za mapo datotek z zgoščeno vrednostjo v imenu v to mapo postavite web.config z 365.00:00:00. V ASP.NET Core glavo nastavite v UseStaticFiles prek StaticFileOptions.OnPrepareResponse.

Gostovane platforme

Shopify, Wix, Squarespace in Webflow datoteke tem in slike strežejo s svojega CDN-ja s svojimi glavami za predpomnjenje, običajno z druge domene, ki je kontrolni seznam ne preverja. Če je tam označena datoteka na vaši domeni, jo nadzoruje platforma in na vaši strani ni kaj spremeniti.

Po spremembi

  • Počistite predpomnilnik CDN-ja ali strani, ko spremenite glave. Predpomnjena kopija obdrži stare glave, dokler ne poteče.
  • Spremembe datotek z navadnimi imeni povratni obiskovalci ne vidijo, dokler njihovo predpomnjenje ne poteče. Pred večjo prenovo dajte CSS-u novo ime ali različico, namesto da skrajšate predpomnjenje.

Potrdite popravek

Znova poženite ukaza curl iz razdelka Preverite sami, nato v PulseKeeperju odprite tarčo in na zavihku Kontrolni seznam kliknite Preveri zdaj. Postavka se v nekaj minutah obarva OK, ne šele ob naslednjem dnevnem preverjanju.