Come si crea un etag che corrisponda ad Apache?
Domanda
Voglio creare un etag che corrisponda a ciò che produce Apache.Come fa Apache a creare i suoi etag?
Soluzione
Apache utilizza il formato standard inode-filesize-mtime.L'unica avvertenza è che mtime deve essere l'ora dell'epoca e riempita con zeri in modo che sia di 16 cifre.Ecco come farlo in PHP:
$fs = stat($file);
header("Etag: ".sprintf('"%x-%x-%s"', $fs['ino'], $fs['size'],base_convert(str_pad($fs['mtime'],16,"0"),10,16)));
Altri suggerimenti
Una cosa da ricordare sugli Etag di Apache è che non funzionano bene nei cluster perché includono informazioni sugli inode che possono, e probabilmente varieranno, tra le macchine nello stesso cluster.
Se stai generando dinamicamente la tua pagina, probabilmente non avrà senso.Se utilizzi PHP, puoi scegliere l'inode e la dimensione del file dello script principale, ma il tempo di modifica non ti dirà se i tuoi dati sono cambiati.A meno che tu non abbia un buon processo di memorizzazione nella cache o semplicemente generi pagine statiche, gli etag non sono utili.Se hai un buon processo di memorizzazione nella cache, l'inode e la dimensione del file sono probabilmente irrilevanti.
Modificare:Per le persone che non sanno cosa etags sono: dovrebbero semplicemente essere un valore che cambia quando il contenuto è cambiato, per scopi di memorizzazione nella cache.Il browser ottiene l'etag dal server web, lo confronta con l'etag per la sua copia memorizzata nella cache e poi recupera l'intera pagina se l'etag è cambiato.
la risposta sopra (da Chris) funziona bene, ma può essere semplificata utilizzando un cast implicito nello sprintf:
sprintf('"%x-%x-%x"', $s['ino'], $s['size'], str_pad($s['mtime'], 16, "0"));
Il suggerito %016x
non funziona perché il riempimento viene applicato dopo la conversione in esadecimale, anziché prima.