Pull to refresh

Отдача HTML заголовков 304 Not Modified на PHP

Всем привет!

Тут мы обсудим работу с заголовком 304 Not Modified на PHP. Здесь вы не найдете подробного разжевывания работы функций, но представлен простой фрагмент кода, который решит эту задачу.

Этот материал может помочь новичкам разобраться в теме, как добиться правильного отображения текущего состояния сайта в браузерах пользователя. Дабы не вдаваться в подробности кеширования файлов сайта на стороне браузеров, прокси серверов, и не лезть в настройки веб сервера (ну мало ли просто не хочется), особенно если есть навыки работы в PHP, предлагаю ознакомиться с моим постом!

Хочу с вами поделиться своей идеей, а точнее, просто способом, которым я реализовал отдачу заголовков LastModified и Not Modified, в случае, когда сайт собран из блоков + файлы таблиц стилей, прочих подключаемых файлов. (Изменив один из блоков, закешированный сайт продолжает отображаться в старом варианте — в браузерах пользователей).

Для решения этой проблемы достаточно добавить этот код в самый верх страницы, предварительно проработав его под свои файлы сайта.

Работа такого блока кода достаточно проста пониманию, но на заре своих опытов в программировании, пока я еще не определился с тем, чему хочу посвятить свою дальнейшую деятельность, эта тематика мне доставила достаточно много хлопот, поскольку дорвеи и прочие сайты (как сделать сайт самому) не могли мне тут помочь, и мне пришлось начать разбираться в PHP с самых базовых основ и возможностей.

1. Определим время последнего изменения текущей страницы, и прочих блоков php (включая и файл CSS и какие угодно другие файлы) и присвоим дексрипторы этих таймштампов в переменные.

2. Далее следует стандартный алгоритм выбора большего числа с занесением его в третью переменную. Подробно описывать не буду.

3. И когда известен самый свежий блок, которых у нас в странице много, мы возьмем его время изменения и присвоим это значение нашей странице, не забыв перевести из формата тайм штамп в формат GMT

gmdate(«D, d M Y H:i:s \G\M\T», $LastModified_unix);

4. При первом обращении браузера к серверу, браузер получит всю страницу целиком и время изменения страницы.
5. При последующем обращении, браузер отправит серверу это значение времени, и, если в нашей странице ничего не менялось, получит ответ Not Modified. Страница не будет передана в браузер.

<?php

$tekuchaya_page = filemtime(«index.php»);
$aas1 = filemtime(«page_bloks/bottom.php»);
$aas2 = filemtime(«page_bloks/header.php»);
$aas3 = filemtime(«page_bloks/links.php»);
$aas4 = filemtime(«page_bloks/linksLeft.php»);
$aas5 = filemtime(«page_bloks/meta.php»);
$aas6 = filemtime(«page_bloks/styles.php»);

if($tekuchaya_page>=$aas1){
$timetime = $tekuchaya_page;
}
else {
$timetime = $aas1;
}

if($aas2>=$timetime){
$timetime = $aas2;
}
if($aas3>=$timetime){
$timetime = $aas3;
}
if($aas4>=$timetime){
$timetime = $aas4;
}
if($aas5>=$timetime){
$timetime = $aas5;
}
if($aas6>=$timetime){
$timetime = $aas6;
}

$LastModified_unix = $timetime; // время последнего изменения страницы

$LastModified = gmdate(«D, d M Y H:i:s \G\M\T», $LastModified_unix);
$IfModifiedSince = false;
if (isset($_ENV['HTTP_IF_MODIFIED_SINCE']))
$IfModifiedSince = strtotime(substr($_ENV['HTTP_IF_MODIFIED_SINCE'], 5));
if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']))
$IfModifiedSince = strtotime(substr($_SERVER['HTTP_IF_MODIFIED_SINCE'], 5));
if ($IfModifiedSince && $IfModifiedSince >= $LastModified_unix) {
header($_SERVER['SERVER_PROTOCOL']. ' 304 Not Modified');
exit;
}
header('Last-Modified: '. $LastModified);
header('Content-type: text/html; charset=utf-8');
?>
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.