13

Apacheが生成するものと一致するetagを作成したいと思います。apacheはどのようにしてetagを作成しますか?

4

4 に答える 4

11

Apacheは、inode-filesize-mtimeの標準形式を使用します。これに対する唯一の注意点は、mtimeはエポック時間であり、16桁になるようにゼロを埋める必要があるということです。PHPでそれを行う方法は次のとおりです。

$fs = stat($file);
header("Etag: ".sprintf('"%x-%x-%s"', $fs['ino'], $fs['size'],base_convert(str_pad($fs['mtime'],16,"0"),10,16)));
于 2008-09-04T23:04:03.837 に答える
2

Apache の Etag について覚えておくべきことの 1 つは、同じクラスター内のマシン間で異なる可能性があり、おそらく変わる可能性がある inode 情報が含まれているため、クラスター内でうまく機能しないことです。

于 2008-09-05T02:00:53.490 に答える
1

ただし、ページを動的に生成している場合、これはおそらく意味がありません。PHPを使用している場合は、メインスクリプトのiノードとファイルサイズを選択できますが、変更時間によってデータが変更されたかどうかはわかりません。優れたキャッシュプロセスがあるか、静的ページを生成するだけでない限り、etagは役に立ちません。適切なキャッシュプロセスがある場合、iノードとファイルサイズはおそらく無関係です。

編集: etagが何であるかを知らない人のために-それらは、キャッシュの目的で、コンテンツが変更されたときに変更される値であると想定されています。ブラウザはWebサーバーからetagを取得し、キャッシュされたコピーのetagと比較して、etagが変更されている場合はページ全体をフェッチします。

于 2008-09-04T23:14:20.240 に答える
1

上記の回答 (Chris から) はうまく機能しますが、sprintf で暗黙のキャストを使用して簡略化できます。

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

%016xパディングは16進数への変換前ではなく変換後に適用されるため、提案された方法は機能しません。

于 2011-07-06T01:59:20.463 に答える