Php 304未修改的问题

Php 304未修改的问题,php,header,http-status-code-304,Php,Header,Http Status Code 304,对不起,标题可能错了。我正在编写一些代码来处理是否修改,以及是否没有匹配的请求作为缓存的一部分。除了PHP在标题后返回一些内容(一个空行)之外,一切都很完美。页面内容应为空。我使用的代码是: <?php $lastmod = filemtime($f); $etag = '"'.dechex($lastmod).'"'; if ($_SERVER['HTTP_IF_MODIFIED_SINCE'] == $last_mod || $_SERVER['HTTP_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();
}
?>

尝试以下代码:

$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;
    }
}
$last\u modified=filemtime($f);
如果(isset($\u服务器[“HTTP\u如果\u修改了\u自”])){
$expected_modified=strotime(preg_replace(“/;.*$/”,“,$”服务器[“HTTP_IF_modified_SINCE”]);
如果($last_modified我在

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

最终解决了这个错误。Gzip是罪魁祸首。因为我正在Gzip对If-Modified-Since和If-None-Match请求的响应,Gzip添加了几个字节(类似于Gzip头)到响应。现在我已经停止将响应压缩到If Modified Been和If None Match请求,它就像一个符咒一样工作。

您的代码没有通过。重新连接?错误:不要在304个响应上添加内容长度标题(参考RFC 2616 sec 4.3)@Haftor-实际上它很好(如果有点愚蠢的话)以304作为响应发送正内容长度“始终由标题字段后的第一个空行终止,而不管消息中存在的实体标题字段如何。”请参阅RFC 2616第4.4节第1项。我的问题不是检测或返回正确的标题,而是php在标题后输出的一个空行。这里的错误:您是否设置了
register\u shutdown\u函数
集?我的代码中没有register\u shutdown\u函数。它是否可以由我的Web主机设置。我使用的是110mb.com,可能是这样的在打开
之前,您有一些奇怪的空格,正如我前面提到的,我的问题不是检测或返回正确的标题,而是php在标题后输出的一个空行。@Ameer-可能使用
exit;
而不是
exit();
<?php
include('caching_headers.php');
caching_headers($_SERVER['SCRIPT_FILENAME'],filemtime($_SERVER['SCRIPT_FILENAME']));
?>