【问题标题】:304 Not Modified issue304未修改问题
【发布时间】:2011-01-27 22:58:23
【问题描述】:

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

【问题讨论】:

  • 您的代码没有通过。重新连接?
  • 此处出错:redbot.org/…
  • 不要在 304 响应中添加 Content-Length 标头(参考 RFC 2616 sec 4.3)
  • @Hafthor - 实际上发送带有 304 的正内容长度作为响应完全没问题(如果有点愚蠢)“总是由标题字段之后的第一个空行终止,无论消息中存在的实体头字段。”请参阅 RFC 2616 第 4.4 节第 1 项。

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


【解决方案1】:

试试这个代码:

$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;
    }
}

【讨论】:

  • 我的问题不在于检测或返回正确的标头,而只是 php 在标头之后输出的空行。
  • 此处出错:redbot.org/…
  • 你有register_shudown_function设置吗?
  • 我的代码中没有 register_shutdown_function。它可以由我的虚拟主机设置。我正在使用 110mb.com
  • 可能是您在打开&lt;?php 之前有一些奇怪的空白。留意那些。此外,请确保您的所有文件都是 Unix EOL 格式(LF,而不是 Windows“CR”格式)。如果一切都失败了,那就是你的主人。
【解决方案2】:

我在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']));
?>

【讨论】:

  • 正如我上面提到的,我的问题不在于检测或返回正确的标头,而只是在标头之后由 php 输出的空行。
  • @Ameer - 也许使用 exit; 而不是 exit();
【解决方案3】:

终于解决了这个bug。 Gzip 是罪魁祸首。由于我也在压缩对 If-Modified-Since 和 If-None-Match 请求的响应,因此 gzip 在响应中添加了一些字节(一种 gzip 标头)。现在我停止了对 If-Modified-Since 和 If-None-Match 请求的 gzip 响应,它就像一个魅力。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-17
    • 2012-08-18
    • 1970-01-01
    • 1970-01-01
    • 2015-12-03
    相关资源
    最近更新 更多