Frage

Ich möchte ein Etag erstellen, das mit dem übereinstimmt, was Apache produziert.Wie erstellt Apache seine Etags?

War es hilfreich?

Lösung

Apache verwendet das Standardformat inode-filesize-mtime.Der einzige Vorbehalt besteht darin, dass die mtime Epochenzeit sein und mit Nullen aufgefüllt werden muss, sodass sie 16 Stellen hat.So machen Sie es 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)));

Andere Tipps

Bei den Etags von Apache ist zu beachten, dass sie in Clustern nicht gut funktionieren, da sie Inode-Informationen enthalten, die zwischen Maschinen im selben Cluster variieren können – und wahrscheinlich auch werden –.

Wenn Sie Ihre Seite jedoch dynamisch generieren, wird dies wahrscheinlich keinen Sinn ergeben.Wenn Sie PHP verwenden, können Sie den Inode und die Dateigröße des Hauptskripts auswählen, die Änderungszeit sagt Ihnen jedoch nicht, ob sich Ihre Daten geändert haben.Sofern Sie nicht über einen guten Caching-Prozess verfügen oder nur statische Seiten generieren, sind Etags nicht hilfreich.Wenn Sie über einen guten Caching-Prozess verfügen, sind Inode und Dateigröße wahrscheinlich irrelevant.

Bearbeiten:Für Leute, die nicht wissen was etags sind – sie sollen lediglich ein Wert sein, der sich aus Caching-Zwecken ändert, wenn sich der Inhalt ändert.Der Browser ruft das Etag vom Webserver ab, vergleicht es mit dem Etag für seine zwischengespeicherte Kopie und ruft dann die gesamte Seite ab, wenn sich das Etag geändert hat.

Die obige Antwort (von Chris) funktioniert gut, kann aber durch eine implizite Umwandlung im Sprintf vereinfacht werden:

sprintf('"%x-%x-%x"', $s['ino'], $s['size'], str_pad($s['mtime'], 16, "0"));

Das vorgeschlagene %016x funktioniert nicht, da die Auffüllung nach der Konvertierung in Hex angewendet wird und nicht vorher.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top