0

要求された CSS ファイルを結合して縮小し、それらをエコーアウトするスクリプトを作成しています。ほとんどの作業は完了しましたが、小さいながらも非常に重要な作業が 1 つ残っています。それは、ブラウザーのキャッシュを活用することです。

私たちのサイトへのほとんどの訪問者は新規であり、めったに戻ってきません。したがって、私たちが本当に心配しているのは、同じセッション内のページ リクエスト間のキャッシュです。同様に、彼らは私たちのメインページにアクセスしてから、他のいくつかのページに移動して去ります.

私が抱えている問題は、特定のファイル セットごとに最後の要求時間のタイムスタンプをセッションに保存していることです。したがって、このリクエストで main.css と internet.css が必要な場合、次に main.css と phone.css で次のページ ビューを表示すると、最後のリクエストのタイムスタンプが更新されますが、同じファイル セットを再度リクエストすると、タイムスタンプが前回と変わらず。

うまくいけば、私は理にかなっています。問題は、ファイルが前回のリクエストから今回のリクエストまで変更されていない場合、304 not modified を返すことです。ただし、ブラウザは css を適切にキャッシュしていません。なぜそうしないのかについてのアイデアはありますか?

ここで私のコードを見ることができます: https://gist.github.com/4235836 (通常はここに配置しますが、ちょっと長いです)

4

1 に答える 1

1

304 を送信する前に、リクエスト ヘッダー If-modified-since を確認する必要があると思います。

if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && 
    strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) >= $minifier->lastModified)
{
    header('HTTP/1.0 304 Not Modified');
    exit;
}

出口にも注​​目。304 を送信する場合は、クライアントが既に最新バージョンを持っていることを意味するため、そこでスクリプトを終了する必要があります。

編集:

期限切れヘッダーを使用すると、ブラウザーは既に最新バージョンを持っていると見なします。そのため、HTTP_IF_MODIFIED_SINCE ヘッダーを使用する場合とは異なり、サーバーにリクエストを送信することさえありません。

したがって、以下も追加できます。

header('Expires: '.gmdate('D, d M Y H:i:s \G\M\T', time() + (60 * 60 * 24)));

次に、ファイルが変更されたときに新しいバージョンを要求することを確認するには、次のようにします。

<link rel="stylesheet" type="text/css" 
    href="minify.php?v=<?php echo filemtime($theFileToMinify) ?>">
于 2012-12-07T20:04:11.247 に答える