web-dev-qa-db-ja.com

expires、cache-control、およびpragma HTTPリクエストヘッダーフィールドは何に設定する必要がありますか?

毎月およそ1回コンテンツを更新するWebサイトを持っています。 HTTP要求ヘッダーフィールドを確認すると、次の出力が表示されます。

Expires: Thu, 19 Nov 1981 08:52:00 GMT 
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 
Pragma: no-cache

私の質問は、コンテンツを更新する頻度を考えると、これらのフィールドを手動で設定してサイトのキャッシュを許可することを考えています。私はphp header()を使用しています;そうするコマンド。

したがって、私の質問は次のとおりです。有効期限、キャッシュ制御、およびプラグマのHTTP要求ヘッダーフィールドは何に設定する必要がありますか。また、それらに加えて他のフィールドを設定する必要がありますか?

3
Wislow

現状では、キャッシュ設定は更新サイクルと一致していないように見えるため、正しい軌道に乗っていると思います。サイトをエンドユーザーとインラインキャッシュでキャッシュできるようにするインジケーターを追加すると、ユーザーエクスペリエンスが向上し、帯域幅とサーバーの負荷を削減できる可能性があります。

上記の設定は、古いコンテンツに対する許容度によって異なります。 Cache-ControlまたはPragmaをまったく設定せず、Expiresをユーザーの訪問からのオフセット(8時間?1日?)に満足できる値に設定することをお勧めします。ただし、これは本当に主観的であり、コンテンツによって異なります。

上記を適切な値に設定することに加えて、条件付きHEAD要求を許可するLast-ModifiedまたはETagなどのヘッダーを設定し、ページがn変更されません。これは、データベースのdate_modifiedフィールド(存在する場合)に基づくことも、ETagの場合、ページコンテンツのハッシュに基づくこともできます。

私は個人的にいくつかのアプローチを取っています。静的ページでは、PHP出力スクリプトに出力バッファーをキャッシュディレクトリに書き込み、ファイルが既に存在する場合は静的な場所から提供されるApache書き換えルールを作成します。次に、キャッシュディレクトリで、Apacheディレクティブをさらに使用して、静的HTMLページのキャッシュとDEFLATE処理を有効にします。出力バッファーを書き込むためのコードはサイト固有ですが、ここで使用するmod-rewriteは(articlesサブディレクトリの.htaccessファイルにあります)

RewriteEngine On
RewriteBase/articles /
RewriteCond%{DOCUMENT_ROOT}/cache%{REQUEST_URI} -f
RewriteRule。?/cache%{REQUEST_URI} [L]

これは基本的に、ファイルがキャッシュに存在する場合、そのファイルにリダイレクトして書き換えを停止することを示しています。

次に、キャッシュディレクトリに次のような設定があります。

有効期限
ExpiresByType text/html "access plus 1 day"
AddOutputFilterByType DEFLATE text/html

そして、サイトテンプレートまたは記事のコンテンツを変更するときに/htdocs/cache/articlesのコンテンツを削除する更新領域のコードとこれを組み合わせます。

この利点は、Apacheがすべての条件付きリクエストと圧縮を処理してくれることです。リクエストごとにPHPにヒットすることはありません。

動的PHPコードの場合、GZip圧縮、有効期限、304 If-Modified-Since応答などを処理する次のオールインワンライブラリを使用します。

http://alexandre.alapetite.fr/doc-alex/php-http-304/index.en.html

2つを組み合わせて、Alexandreのスクリプトを変更して、静的ページの最初のレンダリングでキャッシュフォルダーに出力バッファーを書き込むこともできます。

3
JasonBirch