webdevqa.jp.net

ブラウザのキャッシュを使用してETagを設定する方法

次のように設定して、.htaccessファイルを介して静的サイトのブラウザキャッシュを設定しました。

# BROWER CACHING - 1 Day for images
<filesMatch ".(jpg|jpeg|gif|ico)$">
Header set Cache-Control "max-age=86400, public"
</filesMatch>

これらの画像には1日のキャッシュがありますが、サイトは頻繁に変更されるため、CSSファイルとJSファイルをキャッシュしたくありません。

ETagについて読んだことがあります。これを使用すると、ファイルをキャッシュできるだけでなく、作成日も設定できるため、クライアントが次にサイトにアクセスしたときに更新されると、作成日が一致するかどうかが確認されます。

  1. ETagを正しく理解しましたか?
  2. どうすれば設定できますか?周りを見回しましたが、構成に関する情報が見つかりませんでした。
7
sam

どちらかを使用しますFileETag MTime SizeまたはHeader unset EtagおよびFileEtag none。両方(ETagの作成とETagの削除)を使用せず、特定のサーバーでどちらが最適かを選択するだけです。

# Create the ETag (entity tag) response header field
FileETag MTime Size

または

# Remove the ETag (entity tag) response header field
Header unset ETag
FileETag none
5
Ed-AITpro

ETAGは最も重要な属性ではありません。欠落している主な属性は期限切れです。私は100%確信しています、ブラウザのキャッシュはetagなしで機能します。 http://pisrs.si で以下の構成を確認してください。確認方法は?ブラウザでF12キーを押し、[ネットワーク]タブに移動して、リソースがどのように取得されるかを確認し、サイトと比較します。ローカルホストリソースはさまざまな方法でキャッシュされます。その上であなたのブラウザ情報をチェックしてください。

以下は、メインドメインからの動作中の構成です。必要なMODが有効になっていることを確認してください。

<IfModule mod_mime.c>
    AddType text/css .css
    AddType application/x-javascript .js
    AddType image/bmp .bmp
    AddType image/gif .gif
    AddType application/x-gzip .gz .gzip
    AddType image/x-icon .ico
    AddType image/jpeg .jpg .jpeg .jpe
    AddType image/png .png
    AddType application/x-font-ttf .ttf .ttc
    AddType application/Zip .Zip
</IfModule>
<IfModule mod_expires.c>
    ExpiresActive On
    ExpiresByType text/css A31536000
    ExpiresByType application/x-javascript A31536000
    ExpiresByType application/javascript A31536000
    ExpiresByType text/javascript A31536000
    ExpiresByType text/x-js A31536000
    ExpiresByType image/bmp A31536000
    ExpiresByType image/gif A31536000
    ExpiresByType application/x-gzip A31536000
    ExpiresByType image/x-icon A31536000
    ExpiresByType image/jpeg A31536000
    ExpiresByType application/x-font-otf A31536000
    ExpiresByType image/png A31536000
    ExpiresByType application/x-font-ttf A31536000
    ExpiresByType application/Zip A31536000
</IfModule>
<IfModule mod_deflate.c>
    <IfModule mod_headers.c>
        Header append Vary User-Agent env=!dont-vary
    </IfModule>
        AddOutputFilterByType DEFLATE text/html text/css text/x-component application/x-javascript application/javascript text/javascript text/x-js text/plain image/x-icon image/png image/gif
    <IfModule mod_mime.c>
        # DEFLATE by extension
        AddOutputFilter DEFLATE js css htm html xml png gif
    </IfModule>
</IfModule>
<FilesMatch "\.(gif|ico|jpg|jpeg|png|GIF|ICO|JPG|JPEG|PNG|css|js|woff|CSS|JS|WOFF|ttf|TTF)$">
    <IfModule mod_headers.c>
         Header unset Set-Cookie
         Header set Cache-Control "max-age=31536000, public"
    </IfModule>
</FilesMatch>
3
Mitja Gustin

ETagは単なる一意の不透明なタグであり、等しいことを除いて比較することはできません。そのため、同じリソース(URIなど)に2つのETagがある場合、どちらのリソースが新しいかを判断できません。そのためには、Last-Modifiedヘッダーが必要です。

Last-Modifiedヘッダーでも問題はあります。1秒までしか解決されないため、大幅に変更されたサイト(人気のブログなど)では、異なるETagと同じLast-変更された値。 ETagを単調に増加させて比較できるようにするのに適していなかったのは残念です。

ETagは、GETの場合はIf-None-Matchヘッダー、PUTの場合はIf-Matchを使用する条件付きリクエストで使用されます。最初に、サーバーは、提供されたETagのいずれも現在のETagと一致しない場合にのみ、全体を返す必要があります。リソース(変更された)、および2番目のケース(PUTまたはPATCH)は、一致する場合にのみ、正しいバージョンで作業しています。

ETagとLast-Modifiedはどちらもキャッシュvalidatorヘッダーです。キャッシングの利点のほとんどは、鮮度の概念に関係しています。バリデーターを使用すると、使用しているバージョンがまだ有効かどうかを確認できますが、それでもサーバーにリクエストを送信する必要があります。節約できるのはペイロード転送だけであり、今日では多くの場合、それだけの価値はありません。

一方、フレッシュネス(Expiresヘッダーまたはmax-age Cache-Controlディレクティブ)を使用すると、クライアントは、既に持っているバージョンがまだ新しい(期限切れになっていない)場合に、再検証を回避できます。これにより、サーバーに接続して確認する手間が省けるため、ページの読み込みにかかる時間を大幅に節約できます。

2
Adrien

HTTPにはいくつかの キャッシュに関連する機能 があり、それらはユーザーエージェント(ブラウザ)キャッシュとプロキシキャッシュの両方に適用されます(透過的かどうかに関係なく、たとえばクライアントのネットワーク内のプロキシまたはそのすぐ隣にあるリバースプロキシサーバ)。これらの機能は2つのグループに分類されます: expiration (リクエストを完全に阻止する可能性があります)および validation (データの転送を阻止する可能性があります)。

エンティティタグETag)は、これらの機能の1つにすぎず、検証グループに属しています。このグループのもう1つは、最終変更時刻(Last-Modified)です。 エンティティタグでは、新しい最終変更時刻ではなく、コンテンツの変更によるキャッシュの無効化が可能です。詳細 エンティティタグの仕組み onウィキペディア。つまり、一般的な使用法は次のとおりです。

  1. サーバーは、提供されているリソースを含む応答にETagヘッダーを追加します。

  2. クライアントはリソースをキャッシュし、そのエンティティタグ(ETagの値)を記憶します。

  3. 次回クライアントがリソースを必要とするとき、クライアントはサーバーにリソースを要求します条件付き。リクエストには、エンティティタグを含むIf-None-Matchヘッダーが含まれています。

  4. リソースが変更された場合(If-None-Matchのエンティティタグはサーバーによって古くなったと見なされます)、サーバーはリソースの現在のバージョン(および新しいエンティティタグ)を含む応答を送信します。それ以外の場合は、304 Not Modifiedで応答するだけで、気になりません。リソースを再度送信します。

静的ファイルの場合(またはCGIスクリプトなどによって動的に作成されることもありません)、Apacheは ETagディレクティブを介してFileETagを生成するように構成できます。 )デフォルト、構成を変更せずに、ApacheはETagおよびその値は、Apache 2.4でのファイルの最終変更時間(mtime)とサイズに基づきます。 Apache 2.3.14では、デフォルトでファイルのiノード番号も含まれていました。

ファイルが動的に提供される場合、Apacheはキャッシュされるリソースがどのように生成されるかの詳細を知らないため、ETagを生成できません。 ETagを適切に設定し、If-None-Matchを処理するかどうかは、スクリプト次第です。例えば。 mod_Perlでは、If-None-Matchの部分は Apache2 :: Request :: meets_conditions を使用して処理できます。これにより、HTTP/1.1条件付きリクエストの処理が一般的に実装されます。

ETagのみに依存する場合は、他の検証機能と有効期限メカニズムを無効にする必要があります。 Cache-Control: max-age=0, must-revalidateExpires: 0を設定して、キャッシュエントリの再検証を強制します(つまり、常にリクエストを行います)。応答からLast-Modifiedヘッダーを削除することもできますが、 HTTP/1.1は、一般的に、それに対してアドバイスします

Last-ModifiedETagの比較については、以下を参照してください。

Last-ModifiedはHTTP/1.0互換機能と見なされる であることに注意してください。 ETagには同じ値が含まれ、まったく同じように機能する場合があります(If-None-Matchの代わりにIf-Modified-Sinceを使用する場合を除く)。

補足として、提案された標準 RFC 7232 が存在し、エンティティタグと条件付きリクエストの詳細に関連していることを追加したいと思います。 HTTP /1.1から導入された変更点 については、付録Aを参照してください。

0
Palec