Questa soluzione ha però il limite di richiedere un aggiornamento del sorgente HTML, cosa che in alcune realtà  è scomodo o non possibile. Da qualche tempo quindi applico una tecnica più sofisticata, scrivendo una volta per tutte un HTML/PHP apposito e generando dinamicamente un nome file univoco contenente il timestamp dell'ultima modifica al file, infine uso .htaccess per accedere al file fisico sul server.

Ecco il codice HTML/PHP necessario:

<link rel="stylesheet" type="text/css" href="/css/main.<?php echo filemtime('/server/path/css/main.css'); ?>.css" />
<script language="javascript" src="/js/common.<?php echo filemtime('/server/path/js/common.js'); ?>.js"></script>

che produce nomi di file tipo:

/css/main.1269466887.css
/js/common.1269467087.js

In questo modo, ogni volta che il sorgente JS o CSS viene aggiornato verrà  generato un nome file univoco che il browser dell'utente sarà  "costretto" a scaricare.

Ovviamente, il file main.1269466887.css non esiste sul server ed è necessario reindirizzare questo percorso verso il file originale main.css con alcune semplici regole di rewrite da inserire nel nostro file .htaccess

RewriteEngine On
RewriteRule ^css/(.*)\.[0-9]+\.css /css/$1.css [L]
RewriteRule ^js/(.*)\.[0-9]+\.js /js/$1.js [L]

È tutto e speriamo questo eviti la tipica telefonata (isterica) 4 minuti dopo ogni deploy ^__^.

23 CommentiDi' la tua

Il tuo indirizzo email non sarà mostrato pubblicamente. I campi obbligatori sono contrassegnati da *

Scusa se posto dopo 2 anni ma ho provato e non funziona :( eppure ho modificato il server per far eseguire correttamente .htaccess.....

luigi
luigi

Mah, non lo trovo molto comodo, io ho sempre usato questo sistema: /style.css?v= Cosi si va a pescare la data in formato timestamp dell'ultima volta che é stato modificato il css.

Bukowski
Bukowski

mi auguro proprio di non dover fare n volte il timestamp! :| il file main.1269466887.css nn riesco mica a trovarlo in cache..

rikygio
rikygio

un'altra domanda mi sorge: il file in questione viene salvato nella cache con quale nome? main.1269466887.css mi auguro... Leggere anche le domande precedenti!

neofita
neofita

Ciao ragazzi, 1. il metodo di rewrite inizia quando il file '/css/main.1269466887.css' (ad esempio) non viene trovato nella cache e poi nemmeno nel server? (altrimenti non capisco a che serva...) 2. se ho n files per i css o per i js come devo procedere (fare il timestamp n volte?!?)? Grazie!

neofita
neofita

Questa é un'ottima tecnica. Ma il motivo per cui il timestamp della modifica é inserito fra il nome del file e l'estensione e NON nella query string é dato dal fatto che alcune versioni di uno dei più conosciuti server proxy (Squid) non supporta il caching di URL con querystring. Ciò significa che se mettessimo il timestamp in querystring, le persone che vedranno le pagine tramite un server proxy (es: nelle aziende, scuole, ecc) non memorizzeranno nella cache (del proxy) il file.

Andrea Zilio
Andrea Zilio

Mi unisco alla richiesta di Luca

Fabio
Fabio

Buongiorno a tutti.. se devo essere sincero leggere i vari commenti mi ha un po' confuso le idee.. qual é la soluzione migliore??

Luca
Luca

@Riot Quindi vorresti addirittura impedire il cache dell'html? Però non puoi dire al client "non mettermi in cache la pagina" e poi pretendere che ti faccia una richiesta if modified since. Sono due cose opposte. I file statici, come i file js, sono già  gestiti dai webserver con "last modified" e "if modified since", ma a volte i browser, a seconda delle impostazioni se ne fregano, e se lo fanno, non distinguono fra html o js. Per risolvere un tuo piccolissimo problema, che si può fare come ho detto (io faccio anche di piu, ho una pagina di compilazione che mi comprime ecc.) lo scarichi sugli utenti e sul server. Una pagina é costituita non solo dall'html ma anche da tutti gli elementi che incorpora, se il client ha l'html non aggiornato gli do la possibilità  di recuperare quella pagina così come era, e non fargli vedere delle mostruosità . Nessun extra lavoro per il server, tutto trasparente, compatibile, usabile, veloce ... Troppo semplice?

Mik
Mik

@mik Dimenticavo, le informazioni dei file sono cachate (esistenza, data modifica...) in modo trasparente su php quindi non impatta molto. Inoltre l'utilità  di avere vecchie pagine cachate, magari con link a pagine non più presenti o fuzionalità  cambiate o modificate non farebbe un bell'effetto. L'unico caso in cui poco si può fare sono le copie cache dei motori di ricerca.

Riot
Riot