0

タイトルが間違っている可能性があり、申し訳ありません。キャッシュの一部として If-Modified-Since および If-None-Match リクエストを処理するコードを書いています。PHP がヘッダーの後にコンテンツ (空の行) を返すことを除いて、すべてが完璧に機能します。代わりに、ページのコンテンツを空にする必要があります。私が使用しているコードは次のとおりです。

<?php
$lastmod = filemtime($f);
$etag = '"'.dechex($lastmod).'"';
if ($_SERVER['HTTP_IF_MODIFIED_SINCE'] == $last_mod || $_SERVER['HTTP_IF_NONE_MATCH'] == $etag) {
  header('HTTP/1.1 304 Not Modified');
  header('Content-Length: 0');
  exit();
}
?>
4

3 に答える 3

1

最後にこのバグを解決しました。Gzipが原因でした。If-Modified-Since および If-None-Match リクエストへの応答も gzip していたので、gzip は応答に数バイト (一種の gzip ヘッダー) を追加していました。これで、If-Modified-Since および If-None-Match リクエストへの gzip 応答を停止しました。これは魅力的に機能します。

于 2011-03-08T23:40:43.647 に答える
0

PHPでのHTTP_IF_MODIFIED_SINCEおよびHTTP_IF_NONE_MATCHへの回答で解決策を見つけました

新しいファイル caching_headers.php を作成します

<?php
function caching_headers($file,$timestamp){
    $gmt_mtime=gmdate('r', $timestamp);
    header('ETag: "'.md5($timestamp.$file).'"');
    if(isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])||isset($_SERVER['HTTP_IF_NONE_MATCH'])){
        if ($_SERVER['HTTP_IF_MODIFIED_SINCE']==$gmt_mtime||str_replace('"','',stripslashes($_SERVER['HTTP_IF_NONE_MATCH']))==md5($timestamp.$file)){
            header('HTTP/1.1 304 Not Modified');
            exit();
        }
    }
    header('Last-Modified: '.$gmt_mtime);
    header('Cache-Control: public');
}
?>

キャッシュしたいすべてのphpファイルにこれを追加します。

<?php
include('caching_headers.php');
caching_headers($_SERVER['SCRIPT_FILENAME'],filemtime($_SERVER['SCRIPT_FILENAME']));
?>
于 2011-02-17T22:38:17.080 に答える
0

このコードを試してください:

$last_modified = filemtime($f);
if(isset($_SERVER["HTTP_IF_MODIFIED_SINCE"])) {
    $expected_modified = strtotime(preg_replace('/;.*$/','',$_SERVER["HTTP_IF_MODIFIED_SINCE"]));
    if($last_modified <= $expected_modified) {
        header("HTTP/1.0 304 Not Modified");
        exit;
    }
}
于 2010-03-16T03:21:56.563 に答える