WordPressin HTTP-välimuisti ja Cache-Control-headeritWordPressin suorituskykyä optimoitaessa HTTP-välimuisti ja Cache-Control-headerit ovat usein se näkymätön kerros, joka ratkaisee kaiken. Ne eivät näy teemoissa, eivät lisäosien asetuksissa, eivätkä edes WordPressin hallintapaneelissa – mutta ne määrittävät, kuinka usein WordPressiä ylipäätään ajetaan.

Ilman oikein määriteltyjä HTTP-headerita WordPress tekee työtä turhaan. Oikein määriteltynä sama sisältö voidaan palvella tuhansille käyttäjille ilman, että PHP tai tietokanta herää kertaakaan.

Mitä HTTP-välimuisti oikeasti tarkoittaa

HTTP-välimuisti ei ole WordPress-ominaisuus. Se on selainten, reverse proxyjen ja CDN-verkkojen noudattama standardi. WordPressin rooli on vain yksi: lähettää oikeat headerit.

HTTP-välimuisti toimii kolmella tasolla:

  • selaimen välimuisti

  • välikerrokset (CDN, reverse proxy)

  • origin-palvelin

Cache-Control-headerit kertovat näille kaikille, miten sisältöä saa käsitellä.

Cache-Control on sopimus, ei vihje

Cache-Control-header ei ole toive. Se on eksplisiittinen sääntö. Kun WordPress lähettää vastauksen, se samalla sanoo:

  • saako tämän cachettaa

  • kuinka kauan

  • kenelle

  • missä

Jos säännöt ovat ristiriitaisia tai puutteellisia, välimuisti ei toimi odotetusti.

Tärkeimmät Cache-Control-direktiivit WordPressissä

public ja private

public tarkoittaa, että vastaus voidaan cachettaa:

  • selaimessa

  • CDN:ssä

  • reverse proxyssa

private tarkoittaa, että vastaus:

  • kuuluu vain yhdelle käyttäjälle

  • ei saa mennä jaettuun cacheen

WordPressissä:

  • anonyymi sisältö → public

  • kirjautuneet käyttäjät → private

Jos tätä ei erotella, seuraukset ovat vakavat.

max-age ja s-maxage

max-age määrittää:

  • kuinka kauan selain saa cachettaa vastauksen

s-maxage määrittää:

  • kuinka kauan jaettu cache (CDN, proxy) saa cachettaa

WordPressissä tämä ero on kriittinen. Hyvä malli on:

  • pitkä s-maxage anonyymille sisällölle

  • lyhyempi max-age selaimessa

Tämä antaa hallitun päivittyvyyden ilman backend-kuormaa.

no-cache ja no-store

no-cache ei tarkoita “älä cacheta”. Se tarkoittaa:

  • cache sallittu

  • mutta jokainen pyyntö pitää validoida

no-store tarkoittaa:

  • älä tallenna ollenkaan

WordPress käyttää näitä usein varmuuden vuoksi, mikä:

  • estää edge cachingin

  • tekee CDN:stä hyödytöntä

  • kasvattaa backend-kuormaa

Liiallinen no-cache on yksi yleisimmistä virheistä.

WordPressin oletuskäyttäytyminen

WordPress on varovainen oletuksena

WordPress:

  • lähettää evästeitä herkästi

  • asettaa no-cache-headerit adminissa

  • ei cacheta HTML:ää oletuksena

Tämä on turvallista, mutta huonoa suorituskyvyn kannalta. Oletuslogiikka on tehty toiminnallisuus edellä, ei skaala edellä.

Evästeet ja välimuisti

Yksi WordPress-eväste voi:

  • estää koko HTML-sivun cachettamisen

  • ohittaa CDN:n

  • pakottaa backend-käsittelyn

Siksi WordPress-ympäristössä cache-logiikka pyörii usein evästeiden ympärillä, ei URLien.

HTTP-välimuisti ja reverse proxy

Nginx, Varnish ja WordPress

Reverse proxy käyttää HTTP-headereita päätöksenteossa:

  • cache hit vai miss

  • TTL

  • invalidointi

Jos WordPress lähettää ristiriitaisia headerita, reverse proxy ei voi korjata sitä automaattisesti.

Hyvä WordPress-arkkitehtuuri:

  • erottaa anonyymin ja kirjautuneen liikenteen

  • lähettää selkeät Cache-Control-headerit

  • antaa proxyn tehdä työnsä

Edge caching ja CDN

CDN ei ole taikalaatikko. Se noudattaa HTTP-standardeja. Jos WordPress sanoo “älä cacheta”, CDN tottelee.

Suurin virhe Cloudflaren ja WordPressin yhdistelmissä on:

  • yrittää pakottaa cachea ilman ymmärrystä headereista

Kun headerit ovat kunnossa, CDN toimii ilman hackeja.

Cache-Control ja dynaaminen sisältö

Kaikkea ei tarvitse cachettaa

Hyvä HTTP-välimuisti ei tarkoita:

  • että kaikki on cachettavaa

  • että TTL on aina pitkä

Se tarkoittaa:

  • että cachettava ja ei-cachettava sisältö on eroteltu

WordPressissä tämä tarkoittaa:

  • julkinen sisältö → aggressiivinen cache

  • käyttäjäkohtainen sisältö → private tai no-store

Vary-header ja WordPress

Miksi Vary on vaarallinen

Vary-header kertoo, että cache riippuu jostain muuttujasta, esimerkiksi:

  • Cookie

  • Accept-Encoding

Vary: Cookie on erityisen ongelmallinen WordPressissä, koska:

  • se moninkertaistaa cache-avaimet

  • pienikin eväste muuttaa vastauksen “uudeksi”

Liiallinen Vary tekee cache-hiteistä harvinaisia.

Cache-invalidaatio HTTP-tasolla

TTL vs purge

WordPressin HTTP-välimuisti perustuu yleensä:

  • TTL-arvoihin

  • tai erillisiin purge-pyyntöihin

Lyhyt TTL:

  • yksinkertainen

  • turvallinen

  • vähemmän tehokas

Purge:

  • tehokas

  • vaatii integraation

  • voi mennä helposti överiksi

Useimmat WordPress-sivustot toimivat parhaiten hybridimallilla.

Yleisimmät virheet HTTP-cacheissa

Yleisimpiä virheitä ovat:

  • no-cache kaikkialla

  • evästeiden huolimaton käyttö

  • Vary: Cookie ilman tarvetta

  • sama cache-strategia kaikelle sisällölle

  • WordPress-lisäosan ja proxyn ristiriitainen logiikka

Nämä eivät näy heti, mutta näkyvät laskussa ja kuormassa.

Milloin HTTP-välimuisti on oikein tehty

HTTP-välimuisti on onnistunut, kun:

  • backend-kuorma laskee merkittävästi

  • TTFB paranee globaalisti

  • liikennepiikit eivät näy palvelimessa

  • cache toimii ilman jatkuvaa purkua

Usein paras merkki onnistumisesta on se, että siitä ei tarvitse keskustella enää.

Lopuksi: Cache-Control on WordPressin todellinen suorituskykyrajapinta

WordPressin suorituskyky ei ala PHP:stä eikä pääty JavaScriptiin. Se alkaa siitä, kuinka usein WordPressiä ylipäätään tarvitsee ajaa.

Cache-Control-headerit ovat se rajapinta, jolla WordPress keskustelee selainten, CDN:ien ja proxyjen kanssa. Kun tämä keskustelu on selkeää, järjestelmä toimii rauhallisesti ja ennustettavasti.

Kun se on sekavaa, mikään määrä palvelintehoa ei pelasta tilannetta.