{"id":20021,"date":"2026-06-15T08:34:43","date_gmt":"2026-06-15T06:34:43","guid":{"rendered":"https:\/\/webhosting.de\/http-conditional-caching-etag-last-modified-performance-guide\/"},"modified":"2026-06-15T08:34:43","modified_gmt":"2026-06-15T06:34:43","slug":"http-villkorlig-cachelagring-etag-senast-aendrad-prestandaguide","status":"publish","type":"post","link":"https:\/\/webhosting.de\/sv\/http-conditional-caching-etag-last-modified-performance-guide\/","title":{"rendered":"Att f\u00f6rst\u00e5 villkorlig cachelagring via HTTP med ETag och Last-Modified"},"content":{"rendered":"<p>HTTP-caching sparar tid och data genom att resurser endast laddas om n\u00e4r de faktiskt har \u00e4ndrats. Om <strong>ETag<\/strong> och <strong>Senast modifierad<\/strong> kontrollerar jag med hj\u00e4lp av en villkorad f\u00f6rfr\u00e5gan om servern svarar med 304 Not Modified, vilket avsev\u00e4rt minskar data\u00f6verf\u00f6ringen och belastningen p\u00e5 servern.<\/p>\n\n<h2>Centrala punkter<\/h2>\n\n<p>F\u00f6ljande huvudpunkter visar vad jag l\u00e4gger vikt vid n\u00e4r det g\u00e4ller villkorlig cachelagring med <strong>ETag<\/strong> och <strong>Senast modifierad<\/strong> uppm\u00e4rksamhet.<\/p>\n<ul>\n  <li><strong>Mindre trafik<\/strong>: Of\u00f6r\u00e4ndrade filer returnerar 304, inte hela inneh\u00e5llet \u2013 vilket m\u00e4rkbart minskar datam\u00e4ngden och latensen.<\/li>\n  <li><strong>B\u00e4ttre prestanda<\/strong>: Kortare v\u00e4ntetider f\u00f6rb\u00e4ttrar anv\u00e4ndarupplevelsen och Core Web Vitals, vilket <strong>SEO<\/strong> hj\u00e4lper.<\/li>\n  <li><strong>Tv\u00e5 mekanismer<\/strong>: Last-Modified\/If-Modified-Since och ETag\/If-None-Match validerar cachen p\u00e5 ett s\u00e4kert s\u00e4tt.<\/li>\n  <li><strong>Cache-kontroll<\/strong>: Direktiv styr uppdateringsfrekvens, uppdatering och beteende i mellanliggande cacher.<\/li>\n  <li><strong>Kombination<\/strong>: Tillsammans ger dessa b\u00e5da metoderna h\u00f6g precision och enkla reservl\u00f6sningar.<\/li>\n<\/ul>\n<p>Jag unders\u00f6ker f\u00f6rst vilka resurser som verkligen \u00e4ndras ofta och vilka som \u00e4ndras s\u00e4llan. F\u00f6r filer som s\u00e4llan \u00e4ndras s\u00e4tter jag en <strong>Senast modifierad<\/strong>-tidpunkt och l\u00e4gger till en ETag. F\u00f6r dynamiska svar f\u00f6redrar jag att anv\u00e4nda <strong>ETag<\/strong>, eftersom varje inneh\u00e5lls\u00e4ndring m\u00e4rks omedelbart. P\u00e5 s\u00e5 s\u00e4tt avlastar jag servrarna, minskar f\u00f6rdr\u00f6jningarna och levererar mycket snabba sidor till \u00e5terkommande bes\u00f6kare. Denna strategi st\u00e4rker <strong>Core Web Vitals<\/strong> och d\u00e4rmed indirekt synligheten.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img fetchpriority=\"high\" decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/06\/conditional-caching-8923.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>HTTP-caching med villkor: S\u00e5 h\u00e4r kontrollerar jag giltigheten<\/h2>\n\n<p>Vid en ny beg\u00e4ran skickar klienten, ut\u00f6ver GET, ytterligare rubriker som jag analyserar p\u00e5 serversidan. Om resursen har samma <strong>ETag<\/strong> Om inneh\u00e5llet \u00e4r detsamma som i cachen (If-None-Match) returnerar jag 304 Not Modified utan huvudtext. Om tidsst\u00e4mpeln inte har \u00e4ndrats (If-Modified-Since) svarar servern ocks\u00e5 med 304. Om dag eller datum inte st\u00e4mmer l\u00e4ngre skickar jag 200 OK med nytt inneh\u00e5ll plus uppdaterad <strong>Senast modifierad<\/strong> och ETag. P\u00e5 s\u00e5 s\u00e4tt sparar jag bandbredd, h\u00e5ller cachen uppdaterad och s\u00e4kerst\u00e4ller m\u00e4rkbart snabbare laddningstider.<\/p>\n\n<h2>Last-Modified och If-Modified-Since i vardagen<\/h2>\n\n<p>Rubriken <strong>Senast modifierad<\/strong> Jag utg\u00e5r fr\u00e5n filens faktiska \u00e4ndringstidpunkt, till exempel fr\u00e5n filsystemet. Om en beg\u00e4ran med If-Modified-Since kommer senare och resursen inte har \u00e4ndrats sedan dess, svarar jag med 304. Denna metod \u00e4r okomplicerad, l\u00e4tt att f\u00f6rst\u00e5 och idealisk f\u00f6r statiska tillg\u00e5ngar som CSS, JS eller bilder. Begr\u00e4nsningar uppst\u00e5r p\u00e5 grund av sekundrasteret i HTTP-tidsst\u00e4mplar och situationer d\u00e4r inneh\u00e5ll logiskt \u00e4ndras utan att det finns en tydlig filtidpunkt. D\u00e4r Last-Modified st\u00f6ter p\u00e5 sina gr\u00e4nser kompletterar en <strong>ETag<\/strong> kontrollen.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/06\/meeting_http_caching_4573.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>ETag och If-None-Match i dynamiska system<\/h2>\n\n<p>En <strong>ETag<\/strong> genererar jag som en hash, ett versions-ID eller fr\u00e5n en databaskolumn som markerar statusf\u00f6r\u00e4ndringar. Vid \u00e5terkommande \u00e5tkomst skickar webbl\u00e4saren If-None-Match, jag j\u00e4mf\u00f6r taggen med mitt aktuella v\u00e4rde och svarar d\u00e4refter med 304 eller 200. Denna j\u00e4mf\u00f6relse uppt\u00e4cker alla meningsfulla inneh\u00e5lls\u00e4ndringar utan att f\u00f6rlita sig p\u00e5 filens tidsst\u00e4mpel. S\u00e4rskilt vid API:er, sammansatta sidor eller personaliserade fragment ger detta mycket exakta resultat. Det \u00e4r viktigt att jag h\u00e5ller ETags konsekventa i klustermilj\u00f6er, s\u00e5 att ingen server av misstag anv\u00e4nder en annan <strong>Dag<\/strong> produceras.<\/p>\n\n<h2>Att kombinera Cache-Control p\u00e5 r\u00e4tt s\u00e4tt<\/h2>\n\n<p>Med <strong>Cache-kontroll<\/strong> H\u00e4r definierar jag hur l\u00e4nge inneh\u00e5ll ska betraktas som aktuellt utan att beh\u00f6va h\u00e4mtas p\u00e5 nytt, och n\u00e4r webbl\u00e4saren ska g\u00f6ra en ny validering. Jag anger l\u00e4mpliga max-age-v\u00e4rden beroende p\u00e5 hur ofta inneh\u00e5llet \u00e4ndras och anv\u00e4nder must-revalidate om f\u00f6r\u00e5ldrade data skulle vara kritiska. F\u00f6r versionerade filer \u00e4r en l\u00e5ng giltighetstid l\u00e4mplig, medan svar som \u00e4ndras ofta har kortare livsl\u00e4ngd och sedan kan kontrolleras korrekt via ETag eller datum. P\u00e5 s\u00e5 s\u00e4tt kombinerar jag korta svarstider med korrekt aktualitet. Den som vill f\u00f6rdjupa sig i \u00e4mnet hittar m\u00e5nga exempel under <a href=\"https:\/\/webhosting.de\/sv\/http-cache-kontroll-strategier-hosting-cachemaster\/\">Strategier f\u00f6r cachekontroll<\/a>, som jag anv\u00e4nder i praktiken.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/06\/http-caching-etag-concept-3892.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Steg-f\u00f6r-steg-beskrivning av ett villkorligt GET-f\u00f6rfr\u00e5gan<\/h2>\n\n<p>Vid den f\u00f6rsta beg\u00e4ran skickar servern 200 OK med Cache-Control, <strong>Senast modifierad<\/strong> och ETag, webbl\u00e4saren sparar allt. Vid n\u00e4sta bes\u00f6k avg\u00f6r cachen hur gammal informationen \u00e4r om en omvalidering beh\u00f6vs. Om s\u00e5 \u00e4r fallet skickar webbl\u00e4saren en f\u00f6rfr\u00e5gan med If-None-Match och\/eller If-Modified-Since. Om v\u00e4rdena st\u00e4mmer \u00f6verens med det aktuella l\u00e4get skickar jag 304 Not Modified, och klienten forts\u00e4tter att anv\u00e4nda sin cache. Om de inte l\u00e4ngre st\u00e4mmer f\u00f6ljer 200 OK med ny body och uppdaterad <strong>Valideringsdata<\/strong>.<\/p>\n\n<h2>J\u00e4mf\u00f6relse: ETag vs. Last-Modified<\/h2>\n\n<p>B\u00e5da metoderna ger mig kontroll, men skiljer sig \u00e5t n\u00e4r det g\u00e4ller arbetsinsats, noggrannhet och l\u00e4mplighet. <strong>Senast modifierad<\/strong> utm\u00e4rker sig genom enkel implementering och tydlig semantik, s\u00e5 l\u00e4nge jag har korrekta tidsst\u00e4mplar. ETag \u00e5terger inneh\u00e5llet mycket exakt, men kr\u00e4ver lite logik f\u00f6r att genereras. I m\u00e5nga konfigurationer kombinerar jag b\u00e5da och drar d\u00e4rmed nytta av enkelhet och exakt identifiering. F\u00f6ljande tabell sammanfattar typiska egenskaper och hj\u00e4lper till vid beslutet.<\/p>\n\n<table>\n  <thead>\n    <tr>\n      <th><strong>Aspekt<\/strong><\/th>\n      <th><strong>Senast modifierad<\/strong><\/th>\n      <th><strong>ETag<\/strong><\/th>\n      <th><strong>Ledtr\u00e5d<\/strong><\/th>\n    <\/tr>\n  <\/thead>\n  <tbody>\n    <tr>\n      <td>Identitet<\/td>\n      <td>Tidst\u00e4mpel f\u00f6r senaste \u00e4ndringen<\/td>\n      <td>Inneh\u00e5llshash eller versions-ID<\/td>\n      <td><strong>Tid<\/strong> vs. inneh\u00e5llsbaserad identifierare<\/td>\n    <\/tr>\n    <tr>\n      <td>\u00c4ndringsdetektering<\/td>\n      <td>Sekunduppl\u00f6sning, indirekt<\/td>\n      <td>Direkt inriktat p\u00e5 inneh\u00e5llet<\/td>\n      <td>ETag uppt\u00e4cker de minsta <strong>Skillnader<\/strong><\/td>\n    <\/tr>\n    <tr>\n      <td>implementering<\/td>\n      <td>Mycket l\u00e4tt, filsystemet r\u00e4cker<\/td>\n      <td>Kr\u00e4ver generering och konsekvens<\/td>\n      <td>Kluster beh\u00f6ver samma <strong>ETags<\/strong><\/td>\n    <\/tr>\n    <tr>\n      <td>Anv\u00e4ndning<\/td>\n      <td>Statiska tillg\u00e5ngar<\/td>\n      <td>Dynamiska svar<\/td>\n      <td>Kombinationen t\u00e4cker m\u00e5nga <strong>Fall<\/strong> fr\u00e5n<\/td>\n    <\/tr>\n    <tr>\n      <td>Svar p\u00e5 fr\u00e5gor<\/td>\n      <td>304 med of\u00f6r\u00e4ndrad tidsst\u00e4mpel<\/td>\n      <td>304 vid identisk tagg<\/td>\n      <td>200 vid \u00e4ndringar med nytt <strong>V\u00e4rde<\/strong><\/td>\n    <\/tr>\n  <\/tbody>\n<\/table>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/06\/tech_office_caching_4721.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>I praktiken: Effektiv leverans av statiska tillg\u00e5ngar<\/h2>\n\n<p>Statiska filer som CSS, JS och bilder \u00e4ndras s\u00e4llan och l\u00e4mpar sig v\u00e4l f\u00f6r l\u00e5nga <strong>max-\u00e5lder<\/strong>-tider. F\u00f6r versionerade filer anger jag l\u00e5nga tidsintervall p\u00e5 upp till ett \u00e5r och markerar dem som of\u00f6r\u00e4nderliga, s\u00e5 att webbl\u00e4saren laddar dem utan att fr\u00e5ga om bekr\u00e4ftelse. F\u00f6r icke-versionerade tillg\u00e5ngar v\u00e4ljer jag kortare tidsgr\u00e4nser och f\u00f6rlitar mig p\u00e5 omvalidering via ETag och Last-Modified. P\u00e5 s\u00e5 s\u00e4tt undviker jag f\u00f6r\u00e5ldrat inneh\u00e5ll och h\u00e5ller trafiken l\u00e5g. Om jag ser till att inte <a href=\"https:\/\/webhosting.de\/sv\/http-cache-headers-sabotera-caching-cachefix\/\">Sabotage av cachehuvud<\/a> genom att l\u00e5ta den g\u00f6ra det uppn\u00e5r jag en h\u00f6g tr\u00e4fffrekvens i cachen.<\/p>\n\n<h2>I praktiken: API:er och dynamiska sidor<\/h2>\n\n<p>N\u00e4r det g\u00e4ller API:er brukar jag oftast satsa p\u00e5 <strong>ETags<\/strong>, som jag skapar utifr\u00e5n det serialiserade resultatet eller en versionskolumn. Om dataposten \u00e4ndras genererar jag en ny tagg, vilket klienterna uppt\u00e4cker omedelbart. F\u00f6r inneh\u00e5ll med os\u00e4ker tidsst\u00e4mpel avst\u00e5r jag ofta fr\u00e5n Last-Modified, s\u00e5 att inget felaktigt intryck av aktualitet uppst\u00e5r. Som komplement styr jag livsl\u00e4ngden via Cache-Control och tvingar fram en omvalidering efter utg\u00e5ngen. P\u00e5 s\u00e5 s\u00e4tt h\u00e5ller jag data tillf\u00f6rlitligt aktuella utan att g\u00f6ra svaren on\u00f6digt stora.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/06\/developer_desk_caching_3947.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Testning och \u00f6vervakning av cache-tr\u00e4fffrekvens<\/h2>\n\n<p>Jag kontrollerar rubriker som <strong>ETag<\/strong>, Last-Modified, If-None-Match och If-Modified-Since i utvecklarverktygen. D\u00e5 h\u00e5ller jag koll p\u00e5 svarskoderna, s\u00e4rskilt 304 j\u00e4mf\u00f6rt med 200, f\u00f6r att se hur effektiv min omvalidering \u00e4r. Om 304 s\u00e4llan f\u00f6rekommer justerar jag Cache-Control, giltighetstider och ETag-generering. Loggar och m\u00e4tv\u00e4rden visar mig vilka s\u00f6kv\u00e4gar som ger on\u00f6digt stora svar. F\u00f6r samlade f\u00f6rb\u00e4ttringar anv\u00e4nder jag g\u00e4rna ett <a href=\"https:\/\/webhosting.de\/sv\/http-villkorliga-foerfragningar-cache-validering-optimering-paket\/\">Paketet Conditional-Requests<\/a>, som kombinerar konfiguration och tester.<\/p>\n\n<h2>Webbhotellarkitektur och ETag-f\u00e4llor<\/h2>\n\n<p>I installationer med flera servrar m\u00e5ste en <strong>ETag<\/strong> vara oberoende av instansen, annars fungerar inte igenk\u00e4nningen. Jag ser till att alla noder anv\u00e4nder samma logik och samma nyckel f\u00f6r genereringen. Omv\u00e4nda proxyservrar eller CDN-tj\u00e4nster f\u00e5r inte \u00e4ndra ETag-v\u00e4rden och b\u00f6r vidarebefordra villkorsrubriker korrekt. Vid distributioner med tillg\u00e5ngsfingeravtryck undviker jag serverbaserad omber\u00e4kning av ETag om filen redan har en versionerad URL. Enhetliga regler f\u00f6rhindrar inkonsekventa svar och h\u00e5ller cache-tr\u00e4fffrekvensen h\u00f6g.<\/p>\n\n<h2>F\u00e4rskhet kontra validering: Anv\u00e4nd direktiv p\u00e5 ett precist s\u00e4tt<\/h2>\n\n<p>Jag g\u00f6r en tydlig \u00e5tskillnad mellan <em>F\u00e4rskhet<\/em> (hur l\u00e4nge f\u00e5r en cache anv\u00e4nda en kopia utan att fr\u00e5ga?) och <em>Validering<\/em> (hur kontrollerar jag om den fortfarande \u00e4r giltig?). Om <strong>Cache-kontroll<\/strong> jag styr b\u00e5da p\u00e5 ett mycket detaljerat s\u00e4tt: <strong>max-\u00e5lder<\/strong> anger livsl\u00e4ngden f\u00f6r klienten, <strong>s-maxage<\/strong> f\u00f6r delade cacher som proxyservrar. <strong>allm\u00e4nheten<\/strong> till\u00e5ter cachelagring i delade cacheminnen, <strong>privat<\/strong> begr\u00e4nsar det till slutwebbl\u00e4saren. <strong>m\u00e5ste-omvalidera<\/strong> kr\u00e4ver uppf\u00f6ljning efter utg\u00e5ngen, medan <strong>of\u00f6r\u00e4nderlig<\/strong> f\u00f6rhindrar on\u00f6diga omvalideringar av versionerade tillg\u00e5ngar. <strong>ingen cacheminne<\/strong> f\u00f6rbjuder inte caching, utan kr\u00e4ver alltid en omvalidering; <strong>ingen lagring<\/strong> f\u00f6rbjuder d\u00e4remot lagring helt och h\u00e5llet. \u00c4ldre <strong>Upph\u00f6r att g\u00e4lla<\/strong>-Header anv\u00e4nder jag bara som reservl\u00f6sning, jag flyttar konsekvent logiken till Cache-Control. Och om jag vill mildra avbrott hj\u00e4lper <strong>stale-under-validering<\/strong> och <strong>stale-om-fel<\/strong>, f\u00f6r att kunna visa inneh\u00e5ll som nyligen har upph\u00f6rt att g\u00e4lla, medan jag uppdaterar i bakgrunden eller hanterar eventuella fel.<\/p>\n\n<h2>Starka och svaga ETags, komprimering och varianter<\/h2>\n\n<p>Jag g\u00f6r ett medvetet val mellan starka och svaga validerare. <strong>Starka ETags<\/strong> identifiera exakt samma representation p\u00e5 byte-niv\u00e5 \u2013 perfekt om jag ocks\u00e5 <strong>F\u00f6rfr\u00e5gningar om intervall<\/strong> vill betj\u00e4na p\u00e5 ett effektivt s\u00e4tt. <strong>Svaga ETags<\/strong> (Prefix <code>W\/<\/code>) r\u00e4cker om semantisk \u00f6verensst\u00e4mmelse \u00e4r tillr\u00e4cklig, till exempel vid sm\u00e5, irrelevanta format\u00e4ndringar. Det viktiga \u00e4r hanteringen av <strong>Kompression<\/strong>: Om jag levererar b\u00e5de gzip- och brotli-komprimerat inneh\u00e5ll f\u00e5r inte en och samma ETag g\u00e4lla f\u00f6r alla varianter. Antingen skapar jag taggen utifr\u00e5n den okomprimerade versionen och l\u00e4gger dessutom till en passande <strong>Vary: Acceptera-kodning<\/strong>, eller s\u00e5 genererar jag konsekventa men olika ETags f\u00f6r varje variant. P\u00e5 s\u00e5 s\u00e4tt undviker jag felaktiga tr\u00e4ffar och 200-svar som egentligen borde vara 304. Vid <strong>If-intervall<\/strong> Jag kombinerar r\u00e4ckviddskontroller med en validerare: Om ETag eller datum st\u00e4mmer svarar jag med 206 Partial Content; i annat fall skickar jag 200 med fullst\u00e4ndig kropp, s\u00e5 att klienten f\u00e5r en konsekvent grund.<\/p>\n\n<h2>Att beh\u00e4rska Vary-Header och inneh\u00e5llsf\u00f6rhandling p\u00e5 ett korrekt s\u00e4tt<\/h2>\n\n<p>N\u00e4r servern levererar olika representationer beroende p\u00e5 behov, s\u00e4tter jag <strong>Varierande<\/strong> korrekt. Typiska exempel \u00e4r <strong>Accept-Encoding<\/strong> (kompression), <strong>Acceptera spr\u00e5k<\/strong> (lokalisering) eller specifika funktionsflaggor. Jag undviker att anv\u00e4nda flyktiga huvudfiler som <strong>Anv\u00e4ndaragent<\/strong> eller till och med <strong>Kaka<\/strong> att variera, eftersom det kraftigt f\u00f6rs\u00e4mrar cache-tr\u00e4fffrekvensen. N\u00e4r personalisering kr\u00e4vs markerar jag svaren som <strong>privat<\/strong> eller . <strong>ingen lagring<\/strong> och skilj dem tydligt fr\u00e5n resurser som kan cachelagras offentligt. Viktigt: Variationerna p\u00e5verkar \u00e4ven ETags \u2013 varje variant beh\u00f6ver sin egen, korrekta validator. P\u00e5 s\u00e5 s\u00e4tt s\u00e4kerst\u00e4ller jag att webbl\u00e4sare, proxyservrar och CDN:er till\u00e4mpar samma logik och att ingen variant av misstag blandas ihop med en annan.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/06\/httpcaching-verstehen-2638.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Villkorade f\u00f6rfr\u00e5gningar ut\u00f6ver GET<\/h2>\n\n<p>Villkorliga f\u00f6rfr\u00e5gningar fungerar inte bara vid l\u00e4sning. F\u00f6r skrivande metoder anv\u00e4nder jag <strong>If-Match<\/strong> eller . <strong>If-Unmodified-Since<\/strong>till <em>saknade uppdateringar<\/em> f\u00f6r att f\u00f6rhindra detta. Om klienten vid en PUT- eller DELETE-beg\u00e4ran skickar den senast sedda ETag via <strong>If-Match<\/strong> om, genomf\u00f6r jag \u00e4ndringen endast om serverns status fortfarande \u00e4r densamma \u2013 annars svarar jag med <strong>412 F\u00f6ruts\u00e4ttning uppfylld<\/strong>. F\u00f6r att h\u00e5lla ordning p\u00e5 klienterna kan servern dessutom <strong>428 F\u00f6ruts\u00e4ttning kr\u00e4vs<\/strong> etablera. F\u00f6r snabba tester utan Body anv\u00e4nder jag <strong>HEAD<\/strong>, som ger mig samma rubriker som ett GET-f\u00f6rfr\u00e5gan; perfekt n\u00e4r jag vill testa metadata. Och vid <strong>304<\/strong>-I svaren skickar jag med alla rubriker som \u00e4r relevanta f\u00f6r cachen (Cache-Control, ETag, Expires, Last-Modified) p\u00e5 nytt, s\u00e5 att klienten uppdaterar sina metadata utan att \u00f6verf\u00f6ra sj\u00e4lva inneh\u00e5llet.<\/p>\n\n<h2>S\u00e4kerhet, dataskydd och efterlevnad<\/h2>\n\n<p>Jag sparar inte personuppgifter eller k\u00e4nsligt inneh\u00e5ll i den offentliga cachen. H\u00e4r anv\u00e4nder jag <strong>Cache-kontroll: privat<\/strong> eller . <strong>ingen lagring<\/strong>, s\u00e5 att webbl\u00e4saren eller n\u00e5gon annan instans inte lagrar inneh\u00e5llet. Var f\u00f6rsiktig med anv\u00e4ndarkonton och instrumentpaneler: Svara med <strong>St\u00e4ll in cookie<\/strong> eller . <strong>Auktorisering<\/strong> f\u00e5r inte av misstag vara offentligt cachbara. ETags i sig kan missbrukas som sp\u00e5rningsverktyg om de f\u00f6rblir of\u00f6r\u00e4ndrade under l\u00e5ng tid. Jag hanterar detta genom att endast aktivt anv\u00e4nda validerare d\u00e4r caching \u00e4r \u00f6nskv\u00e4rt, och inaktivera dem f\u00f6r anv\u00e4ndarspecifika rutter eller h\u00e5lla livsl\u00e4ngden kort. P\u00e5 s\u00e5 s\u00e4tt f\u00f6renar jag prestanda med dataskyddskrav.<\/p>\n\n<h2>Implementeringsdetaljer och prestandakostnader<\/h2>\n\n<p>Kostnaden f\u00f6r att skapa en ETag f\u00e5r inte \u00f6verstiga nyttan. F\u00f6r stora filer eller kostsamma renderingar sparar jag taggen tillsammans med metadata (filkontrollsumma, build-hash, databas-<em>radversion<\/em>) och \u00e5terger den inte vid varje f\u00f6rfr\u00e5gan. Vid sammansatta sidor \u00e4r det bra med en <em>Strategi f\u00f6r versionsskapande<\/em>: Jag bygger upp ETag-v\u00e4rdet av stabila del-ETag-v\u00e4rden (t.ex. mall, datafragment, konfiguration), s\u00e5 att sm\u00e5 \u00e4ndringar ger ett specifikt men reproducerbart nytt v\u00e4rde. I kluster synkroniserar jag genereringslogiken i ett gemensamt bibliotek och kontrollerar den i CI s\u00e5 att ingen instans avviker. F\u00f6r extremt stora blobbar anv\u00e4nder jag snabba kontrollsummor (CRC64) eller lagrar bygghashar ist\u00e4llet f\u00f6r att hasha kroppen direkt. D\u00e4r absolut byte-likhet inte \u00e4r n\u00f6dv\u00e4ndig r\u00e4cker det med <strong>svaga ETags<\/strong> som en pragmatisk kompromiss.<\/p>\n\n<h2>Vanliga misstag och hur du undviker dem<\/h2>\n\n<ul>\n  <li><strong>Slumpm\u00e4ssiga ETags<\/strong>: Om taggar genereras p\u00e5 nytt vid varje f\u00f6rfr\u00e5gan blir varje omvalidering meningsl\u00f6s. Jag ser till att v\u00e4rdena \u00e4r deterministiska och endast \u00e4ndras vid faktiska f\u00f6r\u00e4ndringar.<\/li>\n  <li><strong>Felaktig kombination av direktiv<\/strong>: <em>ingen lagring<\/em> Att anv\u00e4nda ETag \u00e4r meningsl\u00f6st \u2013 webbl\u00e4saren lagrar \u00e4nd\u00e5 inte informationen. Jag v\u00e4ljer konsekventa kombinationer f\u00f6r att uppn\u00e5 \u00f6nskat beteende.<\/li>\n  <li><strong>\u00d6verdriven variation<\/strong>: Variationer i Cookie eller User-Agent splittrar cachen. Jag begr\u00e4nsar Vary till faktiska \u00e4ndringar av representationen.<\/li>\n  <li><strong>Kompressionsf\u00e4llor<\/strong>: En gemensam ETag f\u00f6r gzip och br leder till felaktiga tr\u00e4ffar. Jag kopplar ETags korrekt till den specifika varianten och anger Vary p\u00e5 r\u00e4tt s\u00e4tt.<\/li>\n  <li><strong>Tidsavvikelse<\/strong>: Felaktiga serverklockor f\u00f6rvr\u00e4nger Last-Modified. Jag ser till att tidsk\u00e4llorna \u00e4r synkroniserade s\u00e5 att If-Modified-Since fungerar korrekt.<\/li>\n  <li><strong>F\u00f6rv\u00e4xling av no-cache<\/strong>: M\u00e5nga l\u00e4ser det som \u201einte cacha\u201c. Det som menas \u00e4r \u201ealltid revidera\u201c. F\u00f6r ett verkligt f\u00f6rbud anv\u00e4nder jag <em>ingen lagring<\/em>.<\/li>\n<\/ul>\n\n<h2>Fels\u00f6kning, m\u00e4tv\u00e4rden och arbetsfl\u00f6den<\/h2>\n\n<p>F\u00f6r fels\u00f6kning b\u00f6rjar jag p\u00e5 fliken N\u00e4tverk: St\u00e4mmer <strong>Cache-kontroll<\/strong>? Anv\u00e4nds vid rehabilitering <strong>304<\/strong> ist\u00e4llet f\u00f6r 200? Passar <strong>ETag<\/strong> och <strong>Senast modifierad<\/strong> mellan f\u00f6rfr\u00e5gan och svar? Jag kollar upp det <strong>Varierande<\/strong>, f\u00f6r att se om varianterna har identifierats korrekt. I loggarna visar jag <em>Tr\u00e4ff\/Miss<\/em>-Visa andelar, 304-frekvenser och genomsnittliga svarsstorlekar per s\u00f6kv\u00e4g. Om 304-frekvensen \u00f6kar minskar vanligtvis datavolymen och TTFB m\u00e4rkbart. I belastningstester simulerar jag upprepade anrop f\u00f6r att m\u00e4ta revalideringskostnader ist\u00e4llet f\u00f6r \u00f6verf\u00f6ringskostnader. Vid avvikelser tar jag stegvis bort st\u00f6rande faktorer: Set-Cookie, alltf\u00f6r strikta Vary-regler, motstridiga rubriker som Pragma. P\u00e5 s\u00e5 s\u00e4tt hittar jag snabbt den flaskhals som trycker ner tr\u00e4fffrekvensen.<\/p>\n\n<h2>Service Worker som ett kompletterande cache-lager<\/h2>\n\n<p>Om jag anv\u00e4nder en service worker, anv\u00e4nder jag den som ett komplement, inte som n\u00e5got som st\u00e5r i v\u00e4gen. Jag l\u00e5ter den hantera samma <strong>Cache-kontroll<\/strong>-Ta h\u00e4nsyn till signalerna och kombinera strategier som <em>stale-under-validering<\/em> med HTTP-validering via ETag och Last-Modified. Vid offline-anv\u00e4ndning kan arbetaren tillf\u00e4lligt leverera f\u00f6r\u00e5ldrade resurser och omvalidera dem i bakgrunden. Det \u00e4r viktigt att han vidarebefordrar villkorsheaders korrekt, annars g\u00e5r f\u00f6rdelarna med 304 f\u00f6rlorade p\u00e5 n\u00e4tverksstr\u00e4ckan. P\u00e5 s\u00e5 s\u00e4tt drar \u00e4ven PWA-scenarier nytta av korrekt HTTP-caching, ist\u00e4llet f\u00f6r att kringg\u00e5 dess mekanismer.<\/p>\n\n<h2>SEO-effekt och Core Web Vitals<\/h2>\n\n<p>F\u00f6rb\u00e4ttra snabba svar <strong>UX<\/strong> och anv\u00e4ndarsignaler, vilket gynnar rankningen. S\u00e4rskilt \u00e5terkommande bes\u00f6kare gynnas, eftersom deras webbl\u00e4sare h\u00e4mtar m\u00e5nga filer direkt fr\u00e5n cachen eller via 304-svar. Denna l\u00e4gre latens p\u00e5verkar FCP, LCP och TTFB positivt, vilka jag minskar genom riktad omvalidering. Dessutom sparar servern ber\u00e4kningstid, som jag kan anv\u00e4nda f\u00f6r belastningstoppar eller resurskr\u00e4vande f\u00f6rfr\u00e5gningar. P\u00e5 s\u00e5 s\u00e4tt bibeh\u00e5ller jag prestandan samtidigt som inneh\u00e5llet levereras korrekt och snabbt.<\/p>\n\n<h2>Sammanfattning: Min handlingsplan<\/h2>\n\n<p>Jag f\u00f6rlitar mig p\u00e5 en tydlig <strong>Kombination<\/strong> utifr\u00e5n Cache-Control, Last-Modified och ETag. F\u00f6r statiska resurser v\u00e4ljer jag l\u00e5nga livsl\u00e4ngder och s\u00e4kerst\u00e4ller med omvalidering om filerna inte \u00e4r versionerade. F\u00f6r dynamiska svar genererar jag tillf\u00f6rlitliga ETags och h\u00e5ller klusterna konsistenta. D\u00e4refter kontrollerar jag med verktyg, m\u00e4tv\u00e4rden och loggar om 304 f\u00f6rekommer tillr\u00e4ckligt ofta och justerar inst\u00e4llningarna. P\u00e5 s\u00e5 s\u00e4tt s\u00e4kerst\u00e4ller jag snabb leverans, l\u00e4gre belastning och en b\u00e4ttre anv\u00e4ndarupplevelse genom effektiv <strong>HTTP-caching<\/strong>.<\/p>","protected":false},"excerpt":{"rendered":"<p>L\u00e4r dig hur HTTP-villkorlig cachelagring med ETag och Last-Modified fungerar, hur validering av webbl\u00e4sarens cache genomf\u00f6rs och hur du kan optimera laddningstider, bandbredd och serverbelastning med hj\u00e4lp av detta.<\/p>","protected":false},"author":1,"featured_media":20014,"comment_status":"","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[834],"tags":[],"class_list":["post-20021","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-plesk-webserver-plesk-administration-anleitungen"],"acf":[],"_wp_attached_file":null,"_wp_attachment_metadata":null,"litespeed-optimize-size":null,"litespeed-optimize-set":null,"_elementor_source_image_hash":null,"_wp_attachment_image_alt":null,"stockpack_author_name":null,"stockpack_author_url":null,"stockpack_provider":null,"stockpack_image_url":null,"stockpack_license":null,"stockpack_license_url":null,"stockpack_modification":null,"color":null,"original_id":null,"original_url":null,"original_link":null,"unsplash_location":null,"unsplash_sponsor":null,"unsplash_exif":null,"unsplash_attachment_metadata":null,"_elementor_is_screenshot":null,"surfer_file_name":null,"surfer_file_original_url":null,"envato_tk_source_kit":null,"envato_tk_source_index":null,"envato_tk_manifest":null,"envato_tk_folder_name":null,"envato_tk_builder":null,"envato_elements_download_event":null,"_menu_item_type":null,"_menu_item_menu_item_parent":null,"_menu_item_object_id":null,"_menu_item_object":null,"_menu_item_target":null,"_menu_item_classes":null,"_menu_item_xfn":null,"_menu_item_url":null,"_trp_menu_languages":null,"rank_math_primary_category":null,"rank_math_title":null,"inline_featured_image":null,"_yoast_wpseo_primary_category":null,"rank_math_schema_blogposting":null,"rank_math_schema_videoobject":null,"_oembed_049c719bc4a9f89deaead66a7da9fddc":null,"_oembed_time_049c719bc4a9f89deaead66a7da9fddc":null,"_yoast_wpseo_focuskw":null,"_yoast_wpseo_linkdex":null,"_oembed_27e3473bf8bec795fbeb3a9d38489348":null,"_oembed_c3b0f6959478faf92a1f343d8f96b19e":null,"_trp_translated_slug_en_us":null,"_wp_desired_post_slug":null,"_yoast_wpseo_title":null,"tldname":null,"tldpreis":null,"tldrubrik":null,"tldpolicylink":null,"tldsize":null,"tldregistrierungsdauer":null,"tldtransfer":null,"tldwhoisprivacy":null,"tldregistrarchange":null,"tldregistrantchange":null,"tldwhoisupdate":null,"tldnameserverupdate":null,"tlddeletesofort":null,"tlddeleteexpire":null,"tldumlaute":null,"tldrestore":null,"tldsubcategory":null,"tldbildname":null,"tldbildurl":null,"tldclean":null,"tldcategory":null,"tldpolicy":null,"tldbesonderheiten":null,"tld_bedeutung":null,"_oembed_d167040d816d8f94c072940c8009f5f8":null,"_oembed_b0a0fa59ef14f8870da2c63f2027d064":null,"_oembed_4792fa4dfb2a8f09ab950a73b7f313ba":null,"_oembed_33ceb1fe54a8ab775d9410abf699878d":null,"_oembed_fd7014d14d919b45ec004937c0db9335":null,"_oembed_21a029d076783ec3e8042698c351bd7e":null,"_oembed_be5ea8a0c7b18e658f08cc571a909452":null,"_oembed_a9ca7a298b19f9b48ec5914e010294d2":null,"_oembed_f8db6b27d08a2bb1f920e7647808899a":null,"_oembed_168ebde5096e77d8a89326519af9e022":null,"_oembed_cdb76f1b345b42743edfe25481b6f98f":null,"_oembed_87b0613611ae54e86e8864265404b0a1":null,"_oembed_27aa0e5cf3f1bb4bc416a4641a5ac273":null,"_oembed_time_27aa0e5cf3f1bb4bc416a4641a5ac273":null,"_tldname":null,"_tldclean":null,"_tldpreis":null,"_tldcategory":null,"_tldsubcategory":null,"_tldpolicy":null,"_tldpolicylink":null,"_tldsize":null,"_tldregistrierungsdauer":null,"_tldtransfer":null,"_tldwhoisprivacy":null,"_tldregistrarchange":null,"_tldregistrantchange":null,"_tldwhoisupdate":null,"_tldnameserverupdate":null,"_tlddeletesofort":null,"_tlddeleteexpire":null,"_tldumlaute":null,"_tldrestore":null,"_tldbildname":null,"_tldbildurl":null,"_tld_bedeutung":null,"_tldbesonderheiten":null,"_oembed_ad96e4112edb9f8ffa35731d4098bc6b":null,"_oembed_8357e2b8a2575c74ed5978f262a10126":null,"_oembed_3d5fea5103dd0d22ec5d6a33eff7f863":null,"_eael_widget_elements":null,"_oembed_0d8a206f09633e3d62b95a15a4dd0487":null,"_oembed_time_0d8a206f09633e3d62b95a15a4dd0487":null,"_aioseo_description":null,"_eb_attr":null,"_eb_data_table":null,"_oembed_819a879e7da16dd629cfd15a97334c8a":null,"_oembed_time_819a879e7da16dd629cfd15a97334c8a":null,"_acf_changed":null,"_wpcode_auto_insert":null,"_edit_last":null,"_edit_lock":null,"_oembed_e7b913c6c84084ed9702cb4feb012ddd":null,"_oembed_bfde9e10f59a17b85fc8917fa7edf782":null,"_oembed_time_bfde9e10f59a17b85fc8917fa7edf782":null,"_oembed_03514b67990db061d7c4672de26dc514":null,"_oembed_time_03514b67990db061d7c4672de26dc514":null,"rank_math_news_sitemap_robots":null,"rank_math_robots":null,"_eael_post_view_count":"115","_trp_automatically_translated_slug_ru_ru":null,"_trp_automatically_translated_slug_et":null,"_trp_automatically_translated_slug_lv":null,"_trp_automatically_translated_slug_fr_fr":null,"_trp_automatically_translated_slug_en_us":null,"_wp_old_slug":null,"_trp_automatically_translated_slug_da_dk":null,"_trp_automatically_translated_slug_pl_pl":null,"_trp_automatically_translated_slug_es_es":null,"_trp_automatically_translated_slug_hu_hu":null,"_trp_automatically_translated_slug_fi":null,"_trp_automatically_translated_slug_ja":null,"_trp_automatically_translated_slug_lt_lt":null,"_elementor_edit_mode":null,"_elementor_template_type":null,"_elementor_version":null,"_elementor_pro_version":null,"_wp_page_template":null,"_elementor_page_settings":null,"_elementor_data":null,"_elementor_css":null,"_elementor_conditions":null,"_happyaddons_elements_cache":null,"_oembed_75446120c39305f0da0ccd147f6de9cb":null,"_oembed_time_75446120c39305f0da0ccd147f6de9cb":null,"_oembed_3efb2c3e76a18143e7207993a2a6939a":null,"_oembed_time_3efb2c3e76a18143e7207993a2a6939a":null,"_oembed_59808117857ddf57e478a31d79f76e4d":null,"_oembed_time_59808117857ddf57e478a31d79f76e4d":null,"_oembed_965c5b49aa8d22ce37dfb3bde0268600":null,"_oembed_time_965c5b49aa8d22ce37dfb3bde0268600":null,"_oembed_81002f7ee3604f645db4ebcfd1912acf":null,"_oembed_time_81002f7ee3604f645db4ebcfd1912acf":null,"_elementor_screenshot":null,"_oembed_7ea3429961cf98fa85da9747683af827":null,"_oembed_time_7ea3429961cf98fa85da9747683af827":null,"_elementor_controls_usage":null,"_elementor_page_assets":[],"_elementor_screenshot_failed":null,"theplus_transient_widgets":null,"_eael_custom_js":null,"_wp_old_date":null,"_trp_automatically_translated_slug_it_it":null,"_trp_automatically_translated_slug_pt_pt":null,"_trp_automatically_translated_slug_zh_cn":null,"_trp_automatically_translated_slug_nl_nl":null,"_trp_automatically_translated_slug_pt_br":null,"_trp_automatically_translated_slug_sv_se":null,"rank_math_analytic_object_id":null,"rank_math_internal_links_processed":"1","_trp_automatically_translated_slug_ro_ro":null,"_trp_automatically_translated_slug_sk_sk":null,"_trp_automatically_translated_slug_bg_bg":null,"_trp_automatically_translated_slug_sl_si":null,"litespeed_vpi_list":null,"litespeed_vpi_list_mobile":null,"rank_math_seo_score":null,"rank_math_contentai_score":null,"ilj_limitincominglinks":null,"ilj_maxincominglinks":null,"ilj_limitoutgoinglinks":null,"ilj_maxoutgoinglinks":null,"ilj_limitlinksperparagraph":null,"ilj_linksperparagraph":null,"ilj_blacklistdefinition":null,"ilj_linkdefinition":null,"_eb_reusable_block_ids":null,"rank_math_focus_keyword":"HTTP Caching","rank_math_og_content_image":null,"_yoast_wpseo_metadesc":null,"_yoast_wpseo_content_score":null,"_yoast_wpseo_focuskeywords":null,"_yoast_wpseo_keywordsynonyms":null,"_yoast_wpseo_estimated-reading-time-minutes":null,"rank_math_description":null,"surfer_last_post_update":null,"surfer_last_post_update_direction":null,"surfer_keywords":null,"surfer_location":null,"surfer_draft_id":null,"surfer_permalink_hash":null,"surfer_scrape_ready":null,"_thumbnail_id":"20014","footnotes":null,"_links":{"self":[{"href":"https:\/\/webhosting.de\/sv\/wp-json\/wp\/v2\/posts\/20021","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/webhosting.de\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/webhosting.de\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/webhosting.de\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/webhosting.de\/sv\/wp-json\/wp\/v2\/comments?post=20021"}],"version-history":[{"count":0,"href":"https:\/\/webhosting.de\/sv\/wp-json\/wp\/v2\/posts\/20021\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/webhosting.de\/sv\/wp-json\/wp\/v2\/media\/20014"}],"wp:attachment":[{"href":"https:\/\/webhosting.de\/sv\/wp-json\/wp\/v2\/media?parent=20021"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/webhosting.de\/sv\/wp-json\/wp\/v2\/categories?post=20021"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/webhosting.de\/sv\/wp-json\/wp\/v2\/tags?post=20021"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}