Domanda

Come posso ottenere che i contenuti statici su Apache vengano {memorizzati nella cache dal browser} e non {controllati per la freschezza {con ogni richiesta}}?

Sto lavorando su un sito Web ospitato sul server web Apache. Di recente, stavo testando qualcosa con le intestazioni (Content-Type per diversi tipi di contenuto) e ho visto molte richieste condizionali per le immagini. Esempio:

200 /index.php?page=1234&action=list
304 /favicon.ico
304 /img/logo.png
304 /img/arrow.png
(etc.)

Sebbene i file di immagine siano contenuti statici e vengano memorizzati nella cache dal browser, ogni volta che un utente apre una pagina che li collega, vengono richiesti condizionalmente, a cui inviano "304 Non modificato". Va bene (meno dati trasferiti), ma significa più di 20 richieste in più con ogni caricamento della pagina (caricamento della pagina più lungo a causa di tutti quei round-trip, anche con Keep-Alive e pipelining abilitati).

Come faccio a dire al browser di conservare il file esistente e di non verificare la versione più recente?

EDIT: il metodo mod_expires funziona, anche con la favicon.

È stato utile?

Soluzione

Expires in Apache risolve questo

a2enmod expires

deve essere caricato nella configurazione del server e impostato in .htaccess (o nella configurazione del server).

Con un'intestazione Expires , la risorsa è richiesto solo la prima volta. Prima della data di scadenza, le richieste successive vengono soddisfatte dalla cache del browser. Dopo che il tempo specificato è scaduto e la risorsa è necessaria, solo allora viene richiesta di nuovo (in modo condizionale - un 304 verrà restituito per una risorsa invariata). L'unico modo affidabile per cancellarlo dalla cache prima che scada è manualmente o forzando un aggiornamento (di solito Ctrl-F5). (Questo potrebbe essere un problema se la risorsa cambia nel frattempo, ma le immagini statiche non cambiano molto spesso.)

# enable the directives - assuming they're not enabled globally
ExpiresActive on

# send an Expires: header for each of these mimetypes (as defined by server)
ExpiresByType image/png "access plus 1 month"
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"

# css may change a bit sometimes, so define shorter expiration
ExpiresByType text/css "access plus 1 days"

Per favicon.ico è necessario un po 'più di lavoro (Apache normalmente non riconosce i file delle icone di Windows e li invia come testo predefinito / plain).

# special MIME type for icons - see http://www.iana.org/assignments/media-types/image/vnd.microsoft.icon
AddType image/vnd.microsoft.icon .ico
# now we have icon MIME type, we can use it
# my favicon doesn't change much
ExpiresByType image/vnd.microsoft.icon "access plus 3 months"

E voilà, funziona!

Altri suggerimenti

Con la direttiva filesMatch , anziché ExpiresByType , puoi raggruppare Content-Type abbinando sottotipo ( ad es. image / * ), invece di elencare ogni tipo / sottotipo , non sottotipo (ad es. image / jpeg , image / png ).

#Set caching on image files for 11 months
<filesMatch "\.(ico|gif|jpg|png)
<filesMatch "\.(css|js)<*>quot;>
  ExpiresActive On
  ExpiresDefault "access plus 1 week"
  Header append Cache-Control "public"
</filesMatch>
quot;> ExpiresActive On ExpiresDefault "access plus 11 month" Header append Cache-Control "public" </filesMatch>

Secondo questo articolo di Google ho effettuato la scadenza non più di 1 anno ( accesso più 11 mesi ) e aggiunto Cache-Control " public " per abilitare la cache HTTPS per Firefox.

Per CSS e JS, Google consiglia un periodo di scadenza di 1 settimana.

<*>

Se imposti l'intestazione Scade sulla tua risposta http per le tue immagini statiche, il tuo server non verrà ricontrollato per quell'immagine dopo il primo download fino al termine del tempo specificato, ad es. se scarico un file dal tuo server ora che fornisce l'intestazione Scade come

Expires: Fri, 1 Jan 2010 00:00:01 GMT 

quindi il mio browser non lo cercherà di nuovo dal tuo server fino al 2010, a meno che non svuoto la cache / esegua un aggiornamento forzato (Ctrl + F5 su Windows).

C'è una semplice introduzione alla configurazione di questo qui e un elenco di altre risposte probabilmente utili all'indirizzo wikipedia

Per quanto riguarda favicon.ico, inseriscilo nella radice del documento del server, dire / var / www / html e aggiungilo a /etc/httpd/conf/httpd.conf nella sezione Alias: -

Alias /favicon.ico "/var/www/html/favicon.ico"
<Directory "/var/www/html">
    <Files favicon.ico>
       ExpiresActive On
       ExpiresDefault "access plus 1 month"
    </Files>
</Directory>

Quindi un singolo favicon.ico funzionerà per tutti i siti ospitati virtuali poiché lo stai aliasando. Dopo che un utente ha visitato il tuo sito, eventuali ulteriori visite attingeranno alla copia della cache del browser per un mese e non dal Web.

Impossibile ottenere

ExpiresByType image/ico "access plus 1 month"

per funzionare affatto. Forse deve essere di tipo text / plain come suggerito sopra. In ogni caso ExpiresDefault funziona bene.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top