46

Apacheの静的コンテンツを{ブラウザでキャッシュ}し、{鮮度をチェック{すべてのリクエストで}}しないようにするにはどうすればよいですか?

ApacheWebサーバーでホストされているWebサイトで作業しています。最近、ヘッダー(さまざまなタイプのコンテンツのContent-Type)を使用して何かをテストしていて、画像に対する条件付きのリクエストがたくさん見られました。例:

200 /index.php?page=1234&action=list
304 /favicon.ico
304 /img/logo.png
304 /img/arrow.png
(etc.)

画像ファイルは静的コンテンツであり、ブラウザによってキャッシュされますが、ユーザーがそれらにリンクするページを開くたびに、条件付きで要求され、「304NotModified」が送信されます。これは良いことです(転送されるデータが少ない)が、ページの読み込みごとに20以上のリクエストが増えることを意味します(Keep-Aliveとパイプラインが有効になっている場合でも、これらすべてのラウンドトリップによりページの読み込みが長くなります)。

既存のファイルを保持し、新しいバージョンをチェックしないようにブラウザに指示するにはどうすればよいですか?

編集:mod_expiresメソッドは、ファビコンでも機能します。

4

4 に答える 4

62

ApacheのExpiresモジュールはこれを解決します

a2enmod expires

.htaccessサーバー構成にロードし、 (またはサーバー構成で)セットアップする必要があります。

Expiresヘッダーを使用すると、リソースは最初にのみ要求されます。有効期限が切れる前に、後続のリクエストはブラウザのキャッシュから実行されます。指定された時間が経過してリソースが必要になった後、それが再度要求されます(条件付きで-変更されていないリソースに対して304が返されます)。有効期限が切れる前にキャッシュからクリアする唯一の信頼できる方法は、手動で、または強制的に更新することです(通常はCtrl-F5)。(これは、リソースがその間に変更される場合に問題になる可能性がありますが、静的イメージはそれほど頻繁には変更されません。)

# enable the directives - assuming they're not enabled globally
ExpiresActive on

# send an Expires: header for each of these mimetypes (as defined by server)
ExpiresByType image/png "access plus 1 month"
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"

# css may change a bit sometimes, so define shorter expiration
ExpiresByType text/css "access plus 1 days"

favicon.icoの場合、もう少し作業が必要です(Apacheは通常Windowsアイコンファイルを認識せず、これをデフォルトのテキスト/プレーンとして送信します)。

# special MIME type for icons - see http://www.iana.org/assignments/media-types/image/vnd.microsoft.icon
AddType image/vnd.microsoft.icon .ico
# now we have icon MIME type, we can use it
# my favicon doesn't change much
ExpiresByType image/vnd.microsoft.icon "access plus 3 months"

そして出来上がり、ItWorks™!

于 2009-01-15T14:53:25.507 に答える
29

filesMatchディレクティブを使用すると、各ペアをリストする代わりに(例: , )、一致するExpiresByTypeことでグループ化できます(例: )。Content-Typesubtypeimage/*type/subtypesubtypeimage/jpegimage/png

#Set caching on image files for 11 months
<filesMatch "\.(ico|gif|jpg|png)$">
  ExpiresActive On
  ExpiresDefault "access plus 11 month"
  Header append Cache-Control "public"
</filesMatch>

この Google の記事に従って、有効期限を 1 年以内 ( )にし、Firefox の HTTPS キャッシュを有効にするようにaccess plus 11 month追加しました。Cache-Control "public"

CSS と JS の場合、Google は 1 週間の有効期限を推奨しています。

<filesMatch "\.(css|js)$">
  ExpiresActive On
  ExpiresDefault "access plus 1 week"
  Header append Cache-Control "public"
</filesMatch>
于 2012-04-05T18:57:11.740 に答える
3

静的画像のhttp応答にヘッダーを設定した場合Expires、最初のダウンロード後、指定された時間が経過するまで、サーバーはその画像について再度チェックされません。たとえば、サーバーからファイルをダウンロードすると、そのExpiresヘッダーは次のようになります。

Expires: Fri, 1 Jan 2010 00:00:01 GMT 

その後、キャッシュをクリアするか、強制更新(WindowsではCtrl + F5)を実行しない限り、ブラウザは2010年までサーバーからそれを再度検索しません。

これを設定するための簡単な紹介がここにあり、ウィキペディアで他のおそらく役立つ応答のリストがあります

于 2009-01-15T14:57:55.450 に答える
2

favicon.icoについては、サーバードキュメントのルートに/ var / www / htmlと入力し、[エイリアス]セクションの/etc/httpd/conf/httpd.confに追加します。-

Alias /favicon.ico "/var/www/html/favicon.ico"
<Directory "/var/www/html">
    <Files favicon.ico>
       ExpiresActive On
       ExpiresDefault "access plus 1 month"
    </Files>
</Directory>

次に、エイリアスを作成しているため、単一のfavicon.icoがすべての仮想ホストサイトで機能します。ユーザーがサイトにアクセスした後、それ以上アクセスすると、Webからではなく、ブラウザのキャッシュコピーが1か月間使用されます。

取得できませんでした

ExpiresByType image/ico "access plus 1 month"

まったく働くために。たぶん、上記のようにtext/plainと入力する必要があります。いずれの場合でも、ExpiresDefaultは正常に機能します。

于 2011-07-09T18:05:32.043 に答える