Web ページの etag をプログラムで生成する良い方法は何ですか? また、この方法は推奨されますか? etag をオフにすることを推奨するサイトもあれば、手動で作成することを推奨するサイトもあれば、デフォルト設定をアクティブのままにしておくことを推奨するサイトもあります。
6 に答える
コンテンツのハッシュを生成することをお勧めしmd5($content)
ます。
さらに、ハッシュの衝突を防ぐために、コンテンツ要素の ID などを追加したい場合があります (これが適切な場合)。
ETagは、キャッシングに大きく依存している場合に意味があります。これらは、リソース(URLなど)の状態を示す優れた指標です。
たとえば、ajaxリクエストを使用してユーザーの最新のコメントを取得し、新しいコメントがあるかどうかを知りたいとします。新しいコンテンツのアプリケーションに警告するようにETagを変更することは、それをチェックするためのより安価な方法です。
ETagが同じであれば、キャッシュを保持できますが、それ以外の場合は再構築できます。
ETagは、RESTfulAPIでも非常に意味があります。
生成に関しては、スペックを見ると、ほぼ何でもできると思います。タイムスタンプ、ハッシュ、あなた/あなたのアプリケーションにとって意味のあるものなら何でも。
YSlow を起動したところ、Etags について不平を言ったので、少し調べてみました。問題は、Yahoo ブログ(コメントも参照) によると、デフォルトの ETags 実装が、ファイルの inode 番号または ntfs リビジョン番号、またはその他のサーバー固有のものをハッシュの一部として使用することです。これは高速ですが、基本的に、2 つの異なるサーバーによって提供される同じファイルが同じ etag を持つことを防ぎ、ブラウザーとダウンストリーム キャッシュまたは負荷分散の両方を台無しにします。
MD5 ハッシュを使用するという以前の提案は良いものですが、それ自体がパフォーマンスの問題にならないようにする必要があります。その提案の実装は読者次第ですが、これはあなたのフレームワークがあなたのために処理できるようなものであるように思われます。
私自身は、ファイルのタイムスタンプが十分すぎる単純な環境にいるのでFileETag none
、.htaccess ファイルを使用して Apache でそれらをオフにしました。これにより、YSlow が停止し、ファイルの最終更新日まで戻るはずです。
ムファサ、
Yahoo (および YSlow) は実際にその使用を推奨していますが、自動生成された ETag はサーバーごとに異なるという警告があります。
私はまだ投票できないので、ファイル パスとタイムスタンプ (またはテーブル名 + プライマリ フィールド値 + db コンテンツで表される場合はタイムスタンプ) のハッシュの提案に同意するとだけ言います。
一般に、これらの使用を思いとどまらせる「サイト」は Yahoo です。これは、デフォルトの Web サーバーの中には、サーバー ファームで機能する ETAG を自動的に作成しないものがあるためです。(これはYahooが主張するのに正確で正確です。)
ただし、Web サーバーが 1 つしかない場合は問題ありません。そうでない場合は、Web サーバーがこれをどのように処理するかを確認し、適切に対処する必要があります。
ETag は、Web サイト ジェネレーターの前である種のキャッシュ メカニズムを使用する場合に役立ちます。ブラウザー自体はそれらを使用せず、「(if) modified since」または「age」ヘッダー構造体をリッスンします。
とにかく、その単純な性質により、http ヘッダーに ETag を提供しても問題ありません。多くの Web サーバーは単純にファイルの場所とファイルのタイムスタンプを取得し、このデータに対して md5 ハッシュを実行していると聞きました。
例として、当社のソフトウェアでシンプルだが効果的な etag を作成しました。当社のソフトウェアのすべての「コンテンツ ユニット」 (つまり、html、jpeg、gif など) には、一意の ID とバージョン番号があります (つまり、jpeg には ID「17」とバージョン「2」があり、これは一度変更されたことを意味します)。 . したがって、ETag は単純に文字列「id-version」です。ここでは「17-2」です。次の変更では "17-3" になるため、キャッシャーは変更を認識し、新しいコンテンツ パーツを (1 回) 完全に読み込み、独自のキャッシュに格納します。
しかし、おそらく URL とタイムスタンプ (つまり、ファイルのタイムスタンプ) も使用できます。