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 ответа
Наконец-то решил эту ошибку. Gzip был виновником. Поскольку я также распаковывал ответы на запросы If-Modified-Since и If-None-Match, gzip добавлял к ответу несколько байтов (вроде заголовка gzip). Теперь я перестал отправлять ответы на запросы If-Modified-Since и If-None-Match, и это работает как шарм.
Я нашел решение в ответах HTTP_IF_MODIFIED_SINCE и HTTP_IF_NONE_MATCH в 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']));
?>
Попробуйте этот код:
$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;
}
}