Come impostare le intestazioni HTTP (per il controllo della cache)?


238

Come abilitare la memorizzazione nella cache del browser per il mio sito? Metto solo il controllo della cache: pubblico da qualche parte nella mia intestazione in questo modo?

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
Cache-Control:public;
>

Sto usando l'ultima versione di PHP in via di sviluppo sull'ultima versione di XAMPP.


quale lingua lato server stai usando? PHP ?, ASP ?, JSP? il modo in cui imposti le intestazioni è simile ma non è lo stesso. O se stai memorizzando le immagini nella cache ... spesso questo viene fatto nella tua configurazione di Apache (o web server)
scunliffe il

Purtroppo quella "soluzione" genera semplicemente un DOCTYPE non valido ;-) Se desideri farlo da HTML (non lo consiglierei), useresti META HTTP-EQUIV

Risposte:


198

Per utilizzare il controllo della cache in HTML, utilizzare il meta tag , ad es

<meta http-equiv="Cache-control" content="public">

Il valore nel campo contenuto è definito come uno dei quattro valori seguenti.

Alcune informazioni sull'intestazione Cache-Controlsono le seguenti

HTTP 1.1. Valori ammessi = PUBBLICO | PRIVATO | NO-CACHE | NO-STORE.

Pubblico: può essere memorizzato nella cache pubblica condivisa.
Privato: può essere memorizzato solo nella cache privata.
No-Cache: potrebbe non essere memorizzato nella cache.
No-Store: può essere memorizzato nella cache ma non archiviato.

La direttiva CACHE-CONTROL: NO-CACHE indica che le informazioni memorizzate nella cache non devono essere utilizzate e invece le richieste devono essere inoltrate al server di origine. Questa direttiva ha la stessa semantica del PRAGMA: NO-CACHE.

I client DOVREBBERO includere sia PRAGMA: NO-CACHE che CACHE-CONTROL: NO-CACHE quando una richiesta senza cache viene inviata a un server non noto per la conformità HTTP / 1.1. Vedi anche SCADENZE.

Nota: potrebbe essere meglio specificare i comandi di cache in HTTP che nelle istruzioni META, dove possono influenzare più del browser, ma i proxy e altri intermediari che possono memorizzare nella cache informazioni.


30
HTML5 lo proibisce ed <meta>è sempre stato un modo terribile e traballante per specificare la memorizzazione nella cache.
Kornel,

1
@porneL Ho difficoltà a capire quale parte dei tuoi link proibisce quale parte della risposta ... le specifiche del meta tag non dicono nulla sul non gradire ciò che è scritto qui o vietarlo?
Félix Gagnon-Grenier,

1
@ FélixGagnon-Grenier "L'attributo http-equiv è un attributo enumerato" significa che consente solo i valori nella tabella nella specifica. Richiama anche la memorizzazione nella cache nella sezione successiva ("altre direttive pragma"):> Le direttive pragma corrispondenti alle intestazioni che influenzano il modello di elaborazione HTTP (ad esempio la memorizzazione nella cache) non devono essere registrate, in quanto comporterebbero un comportamento a livello HTTP diverso per agenti utente che implementano HTML rispetto agli agenti utente che non lo fanno.
Kornel,

3
Il documento citato non è corretto rispetto al no-storevalore (nonostante il documento stesso faccia riferimento a RFC 2068 ) - no-storeimpedisce che il documento venga archiviato / memorizzato nella cache, ovunque. Considerando no-cacheche consente di essere memorizzato, ma deve verificare con il server ogni volta. I browser tenderanno a memorizzare no-cachepagine per abilitare la funzionalità del pulsante Indietro, ecc.
MrWhite,

3
Google fornisce uno dei riferimenti più semplici per la memorizzazione nella cache HTTP IMO: developers.google.com/web/fundamentals/performance/…
MrWhite

137

Puoi impostare le intestazioni in PHP usando:

<?php
  //set headers to NOT cache a page
  header("Cache-Control: no-cache, must-revalidate"); //HTTP 1.1
  header("Pragma: no-cache"); //HTTP 1.0
  header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past

  //or, if you DO want a file to cache, use:
  header("Cache-Control: max-age=2592000"); //30days (60sec * 60min * 24hours * 30days)

?>

Nota che le intestazioni esatte utilizzate dipenderanno dalle tue esigenze (e se devi supportare HTTP 1.0 e / o HTTP 1.1 )


3
Pragmae Expiressono probabilmente ridondanti per la stragrande maggioranza dei browser. fastly.com/blog/headers-we-dont-want
thijsai

1
@thijsai yeah Anche HTTP / 1.0 è enormemente obsoleto ... usa solo le intestazioni di cui hai bisogno in base alla matrice dell'utente
scunliffe,

51

Come ho scritto è meglio usare il file.htaccess . Tuttavia, fai attenzione al momento in cui lasci il contenuto nella cache.

Uso:

<FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)$">
Header set Cache-Control "max-age=604800, public"
</FilesMatch>

Dove: 604800 = 7 giorni

PS: può essere utilizzato per ripristinare qualsiasi intestazione


30

La pagina all'indirizzo http://www.askapache.com/htaccess/apache-speed-cache-control.html suggerisce di usare qualcosa del genere:

Aggiungi intestazioni controllo cache

Questo va nel tuo file .htaccess di root ma se hai accesso a httpd.conf è meglio.

Questo codice utilizza la direttiva FilesMatch e la direttiva Header per aggiungere intestazioni Cache-Control a determinati file.

# 480 weeks
<FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)$">
Header set Cache-Control "max-age=290304000, public"
</FilesMatch>

3
L'ordine è importante? "età massima = 290304000, pubblica" Oppure "pubblica, età massima = 290304000" o entrambi hanno ugualmente ragione?
Satya Prakash,

2
L'ordine non ha importanza se i valori non sono in conflitto (come cachee no-cache). max-agee publicnon sono in conflitto, quindi l'ordine non ha importanza.
Blaise,

1
Si noti che poiché utilizza la Headerdirettiva, è necessario abilitare mod_headers.
Skippy le Grand Gourou,

@Skippy le Grand Gourou come posso abilitare mod_headers?
Sam,

@SamuelStratford Ho letto che differisce su altre distribuzioni, ma in Debian puoi usare a2enmodo creare un collegamento simbolico da /etc/apache2/mods-available/headers.loada /etc/apache2/mods-enabled/headers.load.
Skippy le Grand Gourou,

21

Questo è il migliore .htaccessche ho usato nel mio attuale sito Web:

<ifModule mod_gzip.c>
mod_gzip_on Yes
mod_gzip_dechunk Yes
mod_gzip_item_include file .(html?|txt|css|js|php|pl)$
mod_gzip_item_include handler ^cgi-script$
mod_gzip_item_include mime ^text/.*
mod_gzip_item_include mime ^application/x-javascript.*
mod_gzip_item_exclude mime ^image/.*
mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*
</ifModule>

##Tweaks##
Header set X-Frame-Options SAMEORIGIN

## EXPIRES CACHING ##
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpg "access 1 year"
ExpiresByType image/jpeg "access 1 year"
ExpiresByType image/gif "access 1 year"
ExpiresByType image/png "access 1 year"
ExpiresByType text/css "access 1 month"
ExpiresByType text/html "access 1 month"
ExpiresByType application/pdf "access 1 month"
ExpiresByType text/x-javascript "access 1 month"
ExpiresByType application/x-shockwave-flash "access 1 month"
ExpiresByType image/x-icon "access 1 year"
ExpiresDefault "access 1 month"
</IfModule>
## EXPIRES CACHING ##

<IfModule mod_headers.c>
    Header set Connection keep-alive
    <filesmatch "\.(ico|flv|gif|swf|eot|woff|otf|ttf|svg)$">
        Header set Cache-Control "max-age=2592000, public"
    </filesmatch>
    <filesmatch "\.(jpg|jpeg|png)$">
        Header set Cache-Control "max-age=1209600, public"
    </filesmatch>
    # css and js should use private for proxy caching https://developers.google.com/speed/docs/best-practices/caching#LeverageProxyCaching
    <filesmatch "\.(css)$">
        Header set Cache-Control "max-age=31536000, private"
    </filesmatch>
    <filesmatch "\.(js)$">
        Header set Cache-Control "max-age=1209600, private"
    </filesmatch>
    <filesMatch "\.(x?html?|php)$">
        Header set Cache-Control "max-age=600, private, must-revalidate"
      </filesMatch>
</IfModule>

3
Esempio quasi perfetto di un file .htaccess ... Sarebbe completo se fossero incluse immagini specifiche e come scrivere il percorso sull'immagine E dove inserire il file .htaccess (ad es. Nella directory dell'immagine o nella directory dell'indice)? .. .per esempio. '<IfModule mod_headers.c> <Files /img/myimage.jpg> Header append Cache-Control "max-age = 3600, must-revalidate" </Files> </IfModule>' ... funzionerebbe? .. O ... o incollato in img dir '<filesmatch "^ (esempio \ .jpg | sample \ .png) $"> Set di intestazioni Cache-Control "max-age = 31536000, public" </filesmatch>' .. Una stessa strategia sembra rischiosa - comunque esempi specifici sarebbero grandi se possibile
Marco-UandL

2
solo FYI: la compressione gzip su file JS e CSS può aiutare a violare la crittografia SSL. Se fai affidamento sulla sicurezza, non attivare gzip
Eduard Void

1
Questa è la memorizzazione nella cache della pagina dell'account di accesso, quindi non è possibile disconnettersi dal proprio account. Ancora peggio, qualcuno non può semplicemente accedere alla pagina dell'account ed effettuare l'accesso con il login degli ultimi utenti. Non è consigliabile utilizzarlo su un sito di eCommerce, quindi è necessario rimuovere il <filesMatch "\.(x?html?|php)$">per evitare la memorizzazione nella cache di pagine HTML statiche. Il resto dei filematch è ok.
nicoX,

1
Hai duplicato <filesmatch "\.(eot|woff|otf|ttf|svg)$">.
nicoX,

2
Si imposta csse jssu privato se si dispone di cache del proxy. Non ho trovato consigli nel tuo link al riguardo. La maggior parte dei CDN consiglia di memorizzare nella cache quei valori.
nicoX,

14

Per il server Apache, è necessario controllare mod_expires per impostare le intestazioni Expires e Cache-Control.

In alternativa, puoi usare la direttiva Header per aggiungere Cache-Control da solo:

Header set Cache-Control "max-age=290304000, public"

5

Il tag di controllo della meta cache consente ai publisher Web di definire come le pagine devono essere gestite dalle cache. Includono direttive per dichiarare cosa dovrebbe essere memorizzabile nella cache, cosa può essere archiviato dalle cache, modifiche del meccanismo di scadenza e controlli di riconvalida e ricarica.

I valori consentiti sono:

Pubblico - può essere memorizzato nella cache pubblica condivisa.
Privato - può essere memorizzato nella cache privata
no-Cache - non può essere memorizzato nella cache.
no-Store - può essere memorizzato nella cache ma non archiviato

Si prega di fare attenzione alla distinzione tra maiuscole e minuscole. Aggiungi il seguente metatag nella fonte della tua pagina web. La differenza di ortografia alla fine del tag è che usi "/> = xml o"> = html.

    <meta http-equiv="Cache-control" content="public">
    <meta http-equiv="Cache-control" content="private">
    <meta http-equiv="Cache-control" content="no-cache">
    <meta http-equiv="Cache-control" content="no-store">

Fonte-> MetaTag


correzione: no-store non deve essere memorizzato nella cache, non è possibile memorizzare nella cache alcuna cache ma deve essere verificato con il server prima di essere prenotato - consultare palizine.plynt.com/issues/2008Jul/cache-contr--attributes
DangerMouse

Controllo cache no-store: no-store è simile a no-cache in quanto la risposta non può essere memorizzata nella cache e riutilizzata, tuttavia esiste un'importante differenza. no-store richiede che la risorsa sia richiesta e scaricata ogni volta dal server di origine. Questa è una caratteristica importante quando si tratta di informazioni private.
MarcoZen,

5

OWASP raccomanda quanto segue,

Quando possibile, assicurarsi che l'intestazione HTTP di controllo della cache sia impostata su no-cache, no-store, must-revalidate, private; e che l'intestazione pragma HTTP è impostata senza cache.

<IfModule mod_headers.c>
    Header set Cache-Control "private, no-cache, no-store, proxy-revalidate, no-transform"
    Header set Pragma "no-cache"
</IfModule>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.