PHPサイトのブラウザキャッシュを防ぐ方法


120

私はphpサイトをクラウドサーバーで実行しています。新しいファイルcss、js、またはイメージを追加すると、ブラウザーはキャッシュに保存されている同じ古いjs、css、およびイメージファイルをロードします。

私のサイトには以下のようなdoctypeとmetaタグがあります

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

  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
  <meta http-equiv="Page-Enter" content="blendTrans(Duration=1.0)">
  <meta http-equiv="Page-Exit" content="blendTrans(Duration=1.0)">
  <meta http-equiv="Site-Enter" content="blendTrans(Duration=1.0)">
  <meta http-equiv="Site-Exit" content="blendTrans(Duration=1.0)">

上記のdoctypeとメタコードのため、新しいファイルではなく、ブラウザーにキャッシュされた同じファイルをロードしています


No Cache in all Browsers。キャッシュしたくないファイルに対して?randomGeneratedNumberを実行することもできます。
Kodemon 2012年

2
あなたはおそらく画像/ JS / CSSの完全に無効にキャッシュしたくない:stackoverflow.com/questions/4206224/...
FoolishSeth

ネクロへの誘惑に抵抗しましたが、これを検討している人はだれでも、止めてください。キャッシングを制御および使用する方法を学びます。不便なエピソードが1つあるからといって、盲目的にキャッシングを無効にしないでください。HTTPからのキャッシングに関する章をお読みください。最終的なガイド —この本(およびRFC)は、テスト付きで必ず読む必要があります。Last-Modifiedを指定し、If-Modified-Sinceに応答し、ETag識別を利用する方法を学びます。次に、アセットが更新されると、その304がもう一度200になると、ブラウザーに通知されます。
amcgregor

回答:


282

これを試して

<?php

header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
?>

6
「MAX-年齢= 0」を除いて、それらはヘッダが... ... PHPは、デフォルトでは、ブラウザのキャッシュを防ぐためにしようと思わ私のインストールで上を指定せずにPHPによって送信されます
高速反射神経

1
古いバージョンのInternet Explorerに代替テーマを送信するWordPressプラグインがあり、一部のキャッシングシステムでひどくトリップしていました。この投稿は、初めてのGoogle検索で生まれました。よくやった。
2014年

3
これはhtml内に埋め込むことができないことに注意してください。これはページの一番上にあるはずです。
ハンターS

9
注:session_start()後で使用する場合Cache-Control: private, max-age=10800, pre-check=10800、180分がのデフォルト値であるため、ヘッダーが上書きされますsession.cache_expire。セッションの開始を避けられないが、キャッシュの使用を無効にする必要がある場合session_cache_limiter('private');session_cache_expire(0);
mgutt 2017年

2
@thdoan functionの2番目のパラメーターheaderは、replaceのブール値です。オプションのreplaceパラメーターは、ヘッダーが以前の同様のヘッダーを置き換えるか、同じタイプの2番目のヘッダーを追加するかを示します。
mrReiha

36

ここで、HTMLで制御する場合は、以下のようにします。オプション1:

<meta http-equiv="expires" content="Sun, 01 Jan 2014 00:00:00 GMT"/>
<meta http-equiv="pragma" content="no-cache" />

そして、あなたがPHPを通してそれを制御したいなら:オプション2の下でそれをしてください

header('Expires: Sun, 01 Jan 2014 00:00:00 GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', FALSE);
header('Pragma: no-cache');

また、オプション2は、プロキシベースのキャッシュの問題を回避するために常に優れています。


10

あなたはこれを試すことができます:

    header("Expires: Tue, 03 Jul 2001 06:00:00 GMT");
    header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
    header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
    header("Cache-Control: post-check=0, pre-check=0", false);
    header("Pragma: no-cache");
    header("Connection: close");

うまくいけば、もしあれば、キャッシュを防ぐのに役立ちます!


これはHTMLファイルのキャッシングにのみ関係がありますか?eTagとは何の関係もありませんか?ありがとう!
サム・レヴィン

4
最初の行だけで十分です。5行目は実際には明らかに間違っており、サーバー応答では何もしません(これは要求ヘッダーです)。6行目は何の効果もありません。私は
続ける

ショットガンアプローチ:すべてを壁に投げ、何かが付着することを望みます。質問自体に対する私のコメントのとおり、HTTP:The Definitive Guideのコピーを入手して、キャッシングに関する章を読むことを強くお勧めします。RFCも、しかしそれらを読むことは明確なスキルです。( "Connection:close"は陽気なフットショットであり、リクエストの効率的なパイプライン処理を無効にするか、何もしませんが、PHPが実際に通過するのではないかと思います。)
amcgregor

7

CSSファイルのキャッシュに問題がありました。PHPでヘッダーを設定しても役に立ちませんでした(おそらく、ヘッダーをリンクするページではなく、スタイルシートファイルでヘッダーを設定する必要があるためでしょうか?)。

私はこのページで解決策を見つけました:https : //css-tricks.com/can-we-prevent-css-caching/

ソリューション:

リンクされたファイルのURIのクエリ部分としてタイムスタンプを追加します。
(css、js、画像などに使用できます)

開発用:

<link rel="stylesheet" href="style.css?<?php echo date('Y-m-d_H:i:s'); ?>">

プロダクションの場合(キャッシュが主に良い場合):

<link rel="stylesheet" type="text/css" href="style.css?version=3.2">
(必要に応じて手動で書き換えます)

またはこれら2つの組み合わせ:

<?php
    define( "DEBUGGING", true ); // or false in production enviroment
?>
<!-- ... -->
<link rel="stylesheet" type="text/css" href="style.css?version=3.2<?php echo (DEBUGGING) ? date('_Y-m-d_H:i:s') : ""; ?>">

編集:

または、これらの2つのよりきれいな組み合わせ:

<?php
    // Init
    define( "DEBUGGING", true ); // or false in production enviroment
    // Functions
    function get_cache_prevent_string( $always = false ) {
        return (DEBUGGING || $always) ? date('_Y-m-d_H:i:s') : "";
    }
?>
<!-- ... -->
<link rel="stylesheet" type="text/css" href="style.css?version=3.2<?php echo get_cache_prevent_string(); ?>">

任意のバージョン、現在のタイムスタンプ(キャッシュを完全に無効にする)…しかし、「デバッグ」フラグの有無にかかわらず、実際に有効で機能するものは1つではありません。ファイルの実際のmtimeを使用しないのはなぜですか?そうすれば、文字通りPHPを更新する必要がなくなり、キャッシュが完全に、そして幻想的に役に立たなくなることはありません。または、適切なLast-ModifiedとETagを設定するNginxやApacheなどの適切に構成されたHTTPサーバーを使用して、静力学を配信します。同様に、そのタイプの「デバッグ」フラグはすでにブラウザに存在しています... (キャッシュを無効にする、キャッシュなしで更新する、キャッシュを空にする、…)
amcgregor

5

場合によっては、ブラウザーのキャッシュを防止することはお勧めできません。解決策を探して、私はこのような解決策を見つけました:

<link rel="stylesheet" type="text/css" href="meu.css?v=<?=filemtime($file);?>">

ここでの問題は、私のシナリオであるサーバーでの更新中にファイルが上書きされた場合、ファイルの内容が同じであってもタイムスタンプが変更されるため、キャッシュが無視されることです。

私はこのソリューションを使用して、コンテンツが変更された場合にのみブラウザにアセットを強制的にダウンロードさせます。

<link rel="stylesheet" type="text/css" href="meu.css?v=<?=hash_file('md5', $file);?>">

うわぁ!これは、メインスレッドにすべてのCSS / JSファイルを常にロードして、サイズ/ハッシュをチェックするため、パフォーマンスとスケーラビリティが非常に悪くなります。
Dalin

@Dalin Gentooライサー(ソースから過度にコンパイルされ、アーキテクチャが調整されていることで「高速化」することで知られているLinuxディストリビューション)の涙を流す前に、stat電話をかけます。ファイルシステムキャッシュなし、16ns、トップス?キャッシュを使用すると、確実に8ns未満。ナノ秒。そして私のシステムでは、MD5は点滅せずに754 MiB /秒を処理できます。(openssl speed md5)組み合わせると、100KBのCSSファイルには、…129µs(マイクロ秒、0.1295ms)+ 8ns(これは最終的な数値に意味のない形で寄与します)= 129µsの追加のオーバーヘッドがあります。
amcgregor

さらに検討すると、「保守」の負担が最も少なく、最も正確で信頼性の高い動作である唯一の「正解」の回答が最も投票されず、そのような薄弱で非現実的な根拠に関する単一のコメントで却下されたことに驚きます。
amcgregor

あなたと私はおそらく別のWebサイトで作業しています。しかし、私は私のコメントを支持します。ある時点でWebページを配信する同時スレッドが数十ある場合は、それがスケーラブルかどうかを質問する必要のない、より良いオプションがあると思います。 hash_file('md5', $deployment_counter)またはhash_file('md5', $cache_clear_counter)頭に浮かぶ最初のものです。
Dalin
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.