web-dev-qa-db-ja.com

Apache:ディレクトリの.htaccessでmax-ageまたはexpiresを設定します

変更されないコンテンツを含むディレクトリがいくつかあります。

このディレクトリとサブディレクトリ内のすべてのものを非常に長い時間キャッシュできることをブラウザに通知する.htaccessファイルを作成することは可能ですか?

可能であれば、各ディレクトリに同じ.htaccessファイルをコピーしたいと思います。

これが可能な場合は、max-age over期限切れ、またはその両方をお勧めしますか?

10
Brian McGinity

したがって、それは可能に見えます..... htaccessファイルの構文は次のとおりです。

Header unset Last-Modified
FileETag none
ExpiresActive On
ExpiresDefault "access plus 1 years"

これにより、Etagsがオフになり、キャッシュ制御がオンになります:max-age

次に、この.htaccessファイルをディレクトリに配置すると、すべてのファイル(サブディレクトリを含む)が1年間キャッシュされます。

キャッシュ可能なすべてのコンテンツを単一のルートディレクトリに置き、httpd.confを次のように編集することにしました。

<Directory "C:\somedir\cache">
  Header unset Last-Modified
  FileETag none
  ExpiresActive On
  ExpiresDefault "access plus 1 years"
</Directory>

私はまだこれをテストしているところです。これでサイトの残りの部分のEtagsがオフにならないことを願っています。これまでのところ、計画どおりに機能しているようです。


更新(6か月後):

ExpiresDefaultを設定し、eタグを許可するのが最善の方法です。

httpd.conf内:

<Directory "C:\somedir\cache">
   ExpiresActive On
   ExpiresDefault "access plus 1 year"
</Directory>

「somedir」がApacheルート(htdocsなど)内にあることを確認してください。

1年後、ブラウザはeタグを渡すことによってファイルを再検証するため、eタグを許可することは良いことです。 Webサーバーは304-NotModifiedを送り返し、max-ageを1年にリセットします。これは非常に効率的です。

全体として、Apacheログファイルを監視して、/ cachedir内のアイテムが一度提供され始めたことを確認できます。

注:必要に応じて、Header append Cache-Control "public"を設定しても問題ないことがわかりました。


最終版:

これが最終バージョンです:(これをhttd.confの下部に追加するだけです)

<Directory "C:\somedir\cache">
   ExpiresActive On
   ExpiresDefault "access plus 1 year"
   Header append Cache-Control "public"
</Directory>

ヘッダーを調べると、次のことがわかります。

Accept-Ranges:bytes
Cache-Control:max-age=31536000, public
Connection:Keep-Alive
Content-Language:en
Content-Length:746
Content-Type:text/css
Date:Thu, 29 May 2014 15:23:50 GMT
ETag:"240000000add63-2ea-4f4086d72ad01"
Expires:Fri, 29 May 2015 15:23:50 GMT
Keep-Alive:timeout=40, max=200
Last-Modified:Fri, 07 Mar 2014 18:28:59 GMT

この意志:

  1. 最大年齢を1年間に設定します(最長推奨)
  2. 1年の有効期限タグを送信します
  3. Etagを送信して、1年後にブラウザがetag検証を実行するようにします
  4. 中間キャッシュデバイス/サービスに、ファイルを1年間キャッシュできることを知らせます。
20
Brian McGinity

参考までに、上記のことを実行してもApacheが再起動しない場合は、次のエラーが発生する可能性があります。

The Apache service named  reported the following error:
>>> Invalid command 'ExpiresActive', perhaps misspelled or defined by a module not included in the server configuration.

このエラーを見つけるには、[スタート]をクリックし、「コンピューターの管理」と入力して起動し、ツリーで[イベントビューアー]-> [Windowsログ]-> [アプリケーション]を開きます。それは私が上記のエラーを見つけたところです。

簡単な修正。httpd.confでこの行のコメントを外すだけです。

#LoadModule expires_module modules/mod_expires.so
2
gfrobenius