リソース ファイルの ETag HTTP ヘッダーを生成するにはどうすればよいですか?
7 に答える
リソースの表現が変わるたびにそれが変わる限り、それをどのように作成するかは完全にあなた次第です。
さらに次のような方法で作成するようにしてください。
- 条件付き GET ごとに再計算する必要はありません。
- リソースの内容が変更されていない場合は変更されません
コンテンツのハッシュを使用すると、計算されたハッシュをファイルと一緒に保存しないと、#1 で失敗する可能性があります。
ファイルシステムを再配置するか、複数のサーバーからコンテンツを提供する場合、inode 番号を使用すると #2 で失敗する可能性があります。
機能するメカニズムの 1 つは、SHA-1 ハッシュやバージョン文字列など、完全にコンテンツに依存するものを使用し、リソースのコンテンツが変更されるたびに一度計算して保存することです。
etag は、サーバーがクライアントに送信する任意の文字列で、次回ファイルが要求されたときにクライアントがサーバーに送り返すものです。
etag は、ファイルに基づいてサーバー上で計算可能である必要があります。チェックサムのようなものですが、送信するすべてのファイルをチェックサムしたくない場合があります。
server client
<------------- request file foo
file foo etag: "xyz" -------->
<------------- request file foo
etag: "xyz" (what the server just sent)
(the etag is the same, so the server can send a 304)
「datestamp-file size-file inode number」という形式で文字列を作成しました。そのため、ファイルがクライアントに提供された後にサーバー上で変更された場合、クライアントが再要求した場合、新しく再生成された etag は一致しません。
char *mketag(char *s, struct stat *sb)
{
sprintf(s, "%d-%d-%d", sb->st_mtime, sb->st_size, sb->st_ino);
return s;
}
http://developer.yahoo.com/performance/rules.html#etagsから:
デフォルトでは、Apache と IIS の両方が ETag にデータを埋め込みます。これにより、複数のサーバーを持つ Web サイトで有効性テストが成功する可能性が大幅に低下します。
...
ETag が提供する柔軟な検証モデルを利用していない場合は、ETag を完全に削除することをお勧めします。
bash でデフォルトの apache etag を生成する方法
for file in *; do printf "%x-%x-%x\t$file\n" `stat -c%i $file` `stat -c%s $file` $((`stat -c%Y $file`*1000000)) ; done
私がetagとまったく同じものを探していたときでさえ(ブラウザはサーバー上で変更された場合にのみファイルを要求します)、それは機能せず、GETトリック(jsファイルへのget引数としてタイムスタンプを追加する)を使用して終了しました)。
Adler-32 を HTML リンク短縮ツールとして使用しています。これが良いアイデアかどうかはわかりませんが、これまでのところ、重複に気づいていません。etag ジェネレーターとして機能する場合があります。そして、sha のような暗号化スキームを使用してハッシュを試みるよりも高速であるはずですが、私はこれを確認していません。私が使用するコードは次のとおりです。
shortlink = str(hex(zlib.adler32(link)+(2**32-1)/2))[2:-1]
それらを使用せず、代わりに最終変更ヘッダーを使用することをお勧めします。
Askapache には、これに関する有用な記事があります。(彼らはほとんどすべてのことをしているようです!)