Выдача Last-Modified, а также работа с If-Modified-Since в PHP-скриптах

<?php
// Определяем дату модификации скрипта и выдаем Last-Modified
$last_modified = filemtime($SCRIPT_FILENAME);
header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $last_modified) . ' GMT');
// Пытаемся получить содержимое If-Modified-Since
foreach($_SERVER as $name => $value) {
if($name == 'HTTP_IF_MODIFIED_SINCE')
$modified_since = $value; }
// Пытаемся преобразовать значение в Unix time
if (isset($modified_since)) {
$modified_since = strtotime(preg_replace('/;.*$/', '', $modified_since));
} else {
$modified_since = 0; }
// Сравниваем даты и выдаем заголовок, если требуется
if ($last_modified <= $modified_since) {
header('HTTP/1.1 304 Not Modified');
exit(); }
?>

В PHP не понимаю вообще ничего, поэтому комменты по оптимизации и исправлению багов крайне приветствуются.

Выдача Last-Modified, а также работа с If-Modified-Since в PHP-скриптах: 10 комментариев

  1. Артём

    Благодаря Вашему коду впервые получилась корректная выдача Ласт_Модифиидъ. Спасибо большое, уже 4 дня долбаюсь с этой оптимизацией, навязанной нам Гуголем. Перерыл кучу всего в интернете: то ошибка 500, то ещё какая-нибудь фигня.

  2. Игорь

    Вот это не практично:
    foreach($_SERVER as $name => $value) {
    if($name == ‘HTTP_IF_MODIFIED_SINCE’)
    $modified_since = $value; }
    // Пытаемся преобразовать значение в Unix time
    if (isset($modified_since)) {
    $modified_since = strtotime(preg_replace(‘/;.*$/’, », $modified_since));
    } else {
    $modified_since = 0; }

    Следует заменить на:
    if(array_key_exists(‘HTTP_IF_MODIFIED_SINCE’, $_SERVER))
    $modified_since = strtotime(preg_replace(‘/;.*$/’, », $_SERVER[‘HTTP_IF_MODIFIED_SINCE’]));
    else $modified_since = 0;

  3. ДЕМОН

    // Определяем дату модификации скрипта и выдаем Last-Modified
    $last_modified = filemtime($SCRIPT_FILENAME);

    дебил чтоль?! нахера нам дата модификации скрипта? скрипт может и вовсе не модифицировался или модифицировался лет 10 назад. ведь изменения страницы добавляются не в скрипт, а в базу. идиот!

    1. Александр Кузьмин Автор записи

      Далеко не всегда данные хранятся в базе, а php вместо статического html иногда приходится применять, когда на сервере нужно провести какую-либо обработку. А невыдача Last-Modified сказывается на частоте индексации страниц поисковиками и позиции в выдаче. Если вы всего этого не знаете — мне вас искренне жаль.

    2. sadad

      Демон, дебил здесь один — это вы. Ине из-за того, что что-то не так сказали (всё верно по сути), а из-за того, что хамло невоспитанное.

  4. Harry

    Ващето модифицировалась страница или нет понятие относительное — относительно даты чтения ее конкретным ботом (яндекса, гугля …), потому — или создаем дополнительную статистику (под яндекс, гугль, майл … ) и пишем туда даты посещения ботов конкретной страницы, и — соответственно отдаем заголовок в зависимости от бота … (что является нарушением с т.з. яндекс), или просто в sitemap.xml правильно указываем даты обновления контента, а поисковики сами знают что перечитать или оставить. А заголовок отдавайте датой редактирования контента.

    1. Александр Кузьмин Автор записи

      Речь идет о том, что иногда требуется, чтобы перед выдачей опубликованного статического контента (т.е. базы в помине нет) на сервере происходили некие обработки. В таких случаях приходится выкручиваться и дата модификации скрипта порой является датой модификации контента.

  5. Alex Tarasov

    Хоть один человек правду сказал, что правильная дата создания документа, находиться в базе, в колонке редактирования (например editnews). Вот ее и нужно прикрутить к скрипту. А сервер не может знать когда вы создавали документ. Да откуда он может знать, что документ создан и не изменялся — например год, два, три или пусть даже 10 лет назад, Он будет отдавать ту дату, которую вы укажете в скрипте, или дату когда вы установили скрипт на сайте. И что интересно, он эту дату будет отдавать для всех новостей одну и туже. А если вы передактируете скрипт, то и дата поменяется на новую. Вот такие вот чудеса. Так, что по нормальному с датой создания документа, без базы не получиться.

Добавить комментарий для КотопесОтменить ответ

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.