HTTPヘッダーを設定する方法(キャッシュ制御用)?


237

サイトのブラウザキャッシュを有効にする方法 このようにヘッダーのどこかにcache-control:publicを置くだけですか?

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
Cache-Control:public;
>

最新バージョンのXAMPPで開発している最新バージョンのPHPを使用しています。


どのサーバー側の言語を使用していますか?PHP?、ASP?、JSP?ヘッダーの設定方法は似ていますが、まったく同じではありません。または、画像をキャッシュしている場合... Apache(またはWebサーバー)の構成で行われることがよくあります
scunliffe

残念なことに、その「ソリューション」は無効なDOCTYPEを生成するだけです;-) HTMLから実行する場合(お勧めしません)、META HTTP-EQUIV

回答:


198

HTMLのキャッシュ・コントロールを使用するには、使用メタタグを、例えば

<meta http-equiv="Cache-control" content="public">

contentフィールドの値は、以下の4つの値のいずれかとして定義されます。

Cache-Controlヘッダーに関するいくつかの情報は次のとおりです

HTTP 1.1。許可される値= PUBLIC | プライベート| ノーキャッシュ| ストアなし。

パブリック-パブリック共有キャッシュにキャッシュできます。
プライベート-プライベートキャッシュにのみキャッシュできます。
キャッシュなし-キャッシュされない場合があります。
ストアなし-キャッシュされますがアーカイブされません。

ディレクティブCACHE-CONTROL:NO-CACHEは、キャッシュされた情報を使用せず、代わりにリクエストをオリジンサーバーに転送する必要があることを示します。このディレクティブの意味は、PRAGMA:NO-CACHEと同じです。

HTTP / 1.1に準拠していないことがわかっているサーバーにキャッシュなしのリクエストが送信された場合、クライアントにはPRAGMA:NO-CACHEとCACHE-CONTROL:NO-CACHEの両方を含める必要があります(SHOULD)。EXPIRESも参照してください。

注:キャッシュコマンドはMETAステートメントよりもHTTPで指定する方がよい場合があります。METAステートメントでは、ブラウザー以上に影響を与える可能性がありますが、プロキシやその他の仲介者が情報をキャッシュする可能性があります。


30
HTML5はこれ禁じて<meta>おり、キャッシュを指定するための常にひどく不安定な方法でした。
Kornel 2014年

1
@porneLリンクのどの部分が回答のどの部分を禁止しているのか理解できません...メタタグの仕様は、ここに書かれていることを嫌ったり、禁止したりすることについて何も述べていません。
フェリックス・ガニオン-グルニエ

1
@FélixGagnon-Grenier "http-equiv属性は列挙型属性です"は、仕様のテーブル内の値のみを許可することを意味します。後のセクションでキャッシングを呼び出すこともできます(「その他のプラグマディレクティブ」)。 HTMLを実装するユーザーエージェントよりも、HTMLを実装しないユーザーエージェント
Kornel 2014

3
引用されたドキュメントはno-store値に関して正しくありません(ドキュメント自体がRFC 2068を参照しているにもかかわらず)- no-storeドキュメントがどこにでも保存/キャッシュされるのを防ぎます。をno-cache保存することはできますが、毎回サーバーに確認する必要があります。ブラウザは、戻るボタン機能などno-cache有効にするためにページを保存する傾向があります
MrWhite

3
:GoogleがIMOキャッシングHTTPのための最も簡単なリファレンスの一つを提供developers.google.com/web/fundamentals/performance/...
MrWhite

137

あなたはできるPHPのヘッダーを設定し使用することにより:

<?php
  //set headers to NOT cache a page
  header("Cache-Control: no-cache, must-revalidate"); //HTTP 1.1
  header("Pragma: no-cache"); //HTTP 1.0
  header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past

  //or, if you DO want a file to cache, use:
  header("Cache-Control: max-age=2592000"); //30days (60sec * 60min * 24hours * 30days)

?>

使用される正確なヘッダーはニーズに依存することに注意してください(HTTP 1.0HTTP 1.1をサポートする必要がある場合)


3
PragmaそしてExpires、おそらく大多数のブラウザにとって冗長です。fastly.com/blog/headers-we-dont-want
thijsai

1
@thijsaiはい、HTTP / 1.0も大幅に古くなっています...ユーザーマトリックスに基づいて、必要なヘッダーのみを使用してください
scunliffe

50

私が書いたように、ファイルを使用するのが最善です.htaccess。ただし、コンテンツをキャッシュに残す時間には注意してください。

使用する:

<FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)$">
Header set Cache-Control "max-age=604800, public"
</FilesMatch>

ここで:604800 = 7日

PS:これは、ヘッダーをリセットするために使用できます


30

http://www.askapache.com/htaccess/apache-speed-cache-control.htmlのページでは、次のようなものを使用することを推奨しています

キャッシュ制御ヘッダーを追加する

これはルートの.htaccessファイルに含まれますが、httpd.confにアクセスできる場合はそれが適しています。

このコードは、FilesMatchディレクティブとHeaderディレクティブを使用して、特定のファイルにCache-Controlヘッダーを追加します。

# 480 weeks
<FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)$">
Header set Cache-Control "max-age=290304000, public"
</FilesMatch>

3
これの順序は重要ですか?「max-age = 290304000、public」または「public、max-age = 290304000」またはその両方が等しく正しいですか?
Satya Prakash 2013

2
値が競合していない場合(cacheおよびなどno-cache)、順序は関係ありません。max-ageそしてpublic順番は関係ないので、競合は発生しません。
ブレーズ2014年

1
Headerディレクティブを使用するため、を有効にする必要があることに注意してくださいmod_headers
Skippy le Grand Gourou

@Skippy le Grand Gourou mod_headersを有効にするにはどうすればよいですか?
サム

@SamuelStratford私はそれを他のディストリビューションでは異なりますが、Debianでは、a2enmodから/etc/apache2/mods-available/headers.loadへのシンボリックリンクを使用または作成できます/etc/apache2/mods-enabled/headers.load
Skippy le Grand Gourou

21

これは.htaccess私が実際のウェブサイトで使用した中で最高です:

<ifModule mod_gzip.c>
mod_gzip_on Yes
mod_gzip_dechunk Yes
mod_gzip_item_include file .(html?|txt|css|js|php|pl)$
mod_gzip_item_include handler ^cgi-script$
mod_gzip_item_include mime ^text/.*
mod_gzip_item_include mime ^application/x-javascript.*
mod_gzip_item_exclude mime ^image/.*
mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*
</ifModule>

##Tweaks##
Header set X-Frame-Options SAMEORIGIN

## EXPIRES CACHING ##
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpg "access 1 year"
ExpiresByType image/jpeg "access 1 year"
ExpiresByType image/gif "access 1 year"
ExpiresByType image/png "access 1 year"
ExpiresByType text/css "access 1 month"
ExpiresByType text/html "access 1 month"
ExpiresByType application/pdf "access 1 month"
ExpiresByType text/x-javascript "access 1 month"
ExpiresByType application/x-shockwave-flash "access 1 month"
ExpiresByType image/x-icon "access 1 year"
ExpiresDefault "access 1 month"
</IfModule>
## EXPIRES CACHING ##

<IfModule mod_headers.c>
    Header set Connection keep-alive
    <filesmatch "\.(ico|flv|gif|swf|eot|woff|otf|ttf|svg)$">
        Header set Cache-Control "max-age=2592000, public"
    </filesmatch>
    <filesmatch "\.(jpg|jpeg|png)$">
        Header set Cache-Control "max-age=1209600, public"
    </filesmatch>
    # css and js should use private for proxy caching https://developers.google.com/speed/docs/best-practices/caching#LeverageProxyCaching
    <filesmatch "\.(css)$">
        Header set Cache-Control "max-age=31536000, private"
    </filesmatch>
    <filesmatch "\.(js)$">
        Header set Cache-Control "max-age=1209600, private"
    </filesmatch>
    <filesMatch "\.(x?html?|php)$">
        Header set Cache-Control "max-age=600, private, must-revalidate"
      </filesMatch>
</IfModule>

3
.htaccessファイルのほぼ完璧な例...特定の画像が含まれていて、画像へのパスを書き込む方法と.htaccessファイルを配置する場所(例:画像ディレクトリまたはインデックスディレクトリ)?.. 。例えば。'<IfModule mod_headers.c> <Files /img/myimage.jpg> Header append Cache-Control "max-age = 3600、must-revalidate" </ Files> </ IfModule>' ...これは機能しますか? 。または...またはimg dir '<filesmatch "^(example \ .jpg | sample \ .png)$"> Header set Cache-Control "max-age = 31536000、public" </ filesmatch>'に貼り付けます。 。まったく同じ戦略は危険に思われます-とにかく具体的な例は可能であれば素晴らしいでしょう
Marco-UandL 2016年

2
参考までに:JSおよびCSSファイルでのgzip圧縮は、SSL暗号化を破るのに役立ちます。セキュリティに依存している場合は、gzipをオンにしないでください
Eduard Void 2017年

1
これはログインアカウントページをキャッシュしているため、アカウントからログアウトできません。さらに悪いことに、誰かがアカウントページにアクセスして、最後のユーザーログインでログインすることはできません。eコマースサイトでの使用はお勧めできません<filesMatch "\.(x?html?|php)$">。静的HTMLページがキャッシュされないようにするには、を削除する必要があります。残りのファイル照合は問題ありません。
nicoX

1
を複製しました<filesmatch "\.(eot|woff|otf|ttf|svg)$">
nicoX

2
プロキシキャッシュがある場合は、プライベートに設定cssjsます。あなたのリンクにそれに関する推奨事項は見つかりませんでした。ほとんどのCDNでは、これらの値をキャッシュすることを推奨しています。
nicoX 2018年

14

Apacheサーバーの場合、ExpiresおよびCache-Controlヘッダーの設定についてmod_expiresを確認する必要があります。

または、Headerディレクティブを使用して、独自にCache-Controlを追加できます。

Header set Cache-Control "max-age=290304000, public"

5

メタキャッシュコントロールタグを使用すると、Webパブリッシャーは、ページをキャッシュで処理する方法を定義できます。これらには、何をキャッシュ可能にすべきか、何をキャッシュに保存できるか、有効期限メカニズムの変更、再検証と再ロードの制御を宣言するディレクティブが含まれています。

許可される値は次のとおりです。

パブリック-パブリック共有キャッシュにキャッシュできます
プライベート-プライベートキャッシュにのみキャッシュ
できますno-Cache-キャッシュできませんno-Store-キャッシュ
できますが、アーカイブできません

大文字と小文字の区別に注意してください。Webページのソースに次のメタタグを追加します。タグの末尾のスペルの違いは、 "/> = xmlまたは"> = htmlを使用することです。

    <meta http-equiv="Cache-control" content="public">
    <meta http-equiv="Cache-control" content="private">
    <meta http-equiv="Cache-control" content="no-cache">
    <meta http-equiv="Cache-control" content="no-store">

ソース- > メタタグ


修正:no-storeはキャッシュしないでください。キャッシュは許可されませんが、予約する前にサーバーで確認する必要があります-palizine.plynt.com/issues/2008Jul/cache-control-attributesを
DangerMouse

Cache-Control no-store-no-storeは、応答をキャッシュして再利用できないという点でno-cacheに似ていますが、重要な違いが1つあります。no-storeでは、リソースを要求し、毎回オリジンサーバーからダウンロードする必要があります。これは、個人情報を扱うときに重要な機能です。
MarcoZen

5

OWASPは以下を推奨します。

可能な限り、キャッシュ制御HTTPヘッダーがno-cache、no-store、must-revalidate、privateで設定されていることを確認してください。そしてプラグマHTTPヘッダーはno-cacheで設定されます。

<IfModule mod_headers.c>
    Header set Cache-Control "private, no-cache, no-store, proxy-revalidate, no-transform"
    Header set Pragma "no-cache"
</IfModule>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.