ブラウザキャッシュは意識して設定しないと簡単に無効になったり有効になったりしてしまいます。
必ず無効にしたい or 必ず有効にしたいというポリシーがあるなら、きちんとした設定が必要です。

・ブラウザキャッシュを無効する方法
http://blog.knockoutmarch.com/2008/02/06/2323.html
より引用

HTML:
  1. <!-- メタタグに以下を記述。 -->
  2. <meta http-equiv="Pragma" content="no-cache">
  3. <meta http-equiv="Cache-Control" content="no-store">
  4. <meta http-equiv="Cache-Control" content="no-cache">
  5. <meta http-equiv="Expires" content="-1">
  6.  
  7. <!-- また、body内に以下を記述。 (for safari) -->
  8. <iframe style="height:0px;width:0px;visibility:hidden" src="about:blank">
  9.     this frame prevents back forward cache
  10. </iframe>

・ブラウザキャッシュを有効にする方法

そもそも、あるリンクをクリックした後のブラウザキャッシュ挙動には2パターンあることに注意
1. キャッシュしてあるコンテンツが新しくなっていないかwebサーバに問い合わせる。新しくなってなければキャッシュを使う。 (Last-Modified & If-Modified-Since & 304 status)

2. webサーバに問い合わせず、キャッシュをそのまま使う (Expires or Cache-Control: max-age)

しかも、ブラウザによってhttpレスポンス/リクエストヘッダのLast-Modified, Expiresなどの解釈や優先順位が違うことに注意。
http://labs.cybozu.co.jp/blog/kazuho/archives/2006/02/utilizing_cache.php
http://fdays.blogspot.com/2007/11/ie6cache-controlcache.html

以上を踏まえると、PHPコンテンツに対して、ブラウザキャッシュを上記2番の方法で一定時間有効にしたいときは下記のようにしとけば良さそう ( $interval 秒だけキャッシュを有効にしたいとする)

PHP:
  1. header( "Expires: " . gmdate( "D, d M Y H:i:s", time() + $interval ) . " GMT" );
  2. header( "Cache-Control: max-age=" . $interval);
  3. header( "Pragma: cache"); // no-cache以外にすればOK

キャッシュを無効にしたい場合も、有効にしたい場合も、同じようなhttpリクエスト項目を複数指定する必要があるのがだるい・・・