304 Not Modified问题

时间:2010-03-16 03:14:02

标签: php header http-status-code-304

抱歉可能是错误的标题。我正在编写一些代码来处理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();
}
?>

3 个答案:

答案 0 :(得分:1)

终于解决了这个bug。 Gzip是罪魁祸首。由于我正在对If-Modified-Since和If-None-Match请求的响应进行gzip,gzip正在向响应中添加几个字节(一种gzip头)。现在我已经停止对If-Modified-Since和If-None-Match请求进行gzipping响应,它就像魅力一样。

答案 1 :(得分: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;
    }
}

答案 2 :(得分:0)

我在Answering HTTP_IF_MODIFIED_SINCE and HTTP_IF_NONE_MATCH in PHP

中找到了解决方案

创建新文件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']));
?>