自分でページ (または少なくともその Etag) をキャッシュしないと、実際に 304 を利用することはできません。本格的なキャッシュ アルゴリズムはやや範囲外ですが、一般的な考え方は次のとおりです。
<?php
function getUrlEtag($url){
//some logic to get an etag, possibly stored in memcached / database / file etc.
}
function setUrlEtag($url,$etag){
//some logic to get an etag, possibly stored in memcached / database / file etc.
}
function getPageCache($url,$etag=''){
//[optional]some logic to get the page from cache instead, possibly not even using etag
}
function setPageCache($url,$content,$etag=''){
//[optional]some logic to save the page to cache, possibly not even using etag
}
ob_start();
$etag = getUrlEtag($_SERVER['REQUEST_URI']);
if(isset($_SERVER['HTTP_IF_NONE_MATCH']) && trim($_SERVER['HTTP_IF_NONE_MATCH']) == $etag) {
header("HTTP/1.1 304 Not Modified");
exit;
}
if(($content=getPageCache($_SERVER['REQUEST_URI'],$etag))!==false){
echo $content;
exit;
}
?>
//the actual page
<?php
$content = ob_get_clean();
setUrlEtag($_SERVER['REQUEST_URI'],$etag=md5($url.$content));
function setPageCache($_SERVER['REQUEST_URI'],$content,$etag);
header("Etag: $etag");
echo $content;
?>
すべての一般的な落とし穴が適用されます: ログインしているユーザーのキャッシュ ページを表示できない可能性がある、部分的なコンテンツのキャッシュがより望ましい可能性がある、キャッシュ内の古いコンテンツを防止する責任がある (変更時にバックエンドまたはデータベースでトリガーを使用する可能性がある、またはロジックで遊んでいるだけですgetUrlEtag
)など
HTTP_IF_MODIFIED_SINCE
それが制御しやすい場合は、いじることもできます。