Domanda

Voglio creare un etag che corrisponda a ciò che produce Apache.Come fa Apache a creare i suoi etag?

È stato utile?

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.

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