Вопрос по настройке заголовка Last-Modified

MALTIZER
На сайте с 27.12.2012
Offline
76
3009

На днях решил заняться ускорением индексации сайта, среди прочих решений было следующее - Нужно сделать так чтобы в ответ на запрос пользователя или поискового робота сервер отдавал заголовок Last-Modified, который говорит клиенту (поисковому роботу/посетителю сайта) о времени последнего изменения страницы.

В общем, нашёл инструкцию, вроде всё просто нужно вставить вот этот код:

<?php

$LastModified_unix = strtotime(date("D, d M Y H:i:s", filectime($_SERVER['SCRIPT_FILENAME'])));
$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);

?>

Между тегами <head>…</head>

Где,

- первая строчка кода преобразует текстовое представление даты на английском языке в метку в формате Unix Time Stamp, таким образом используя автоматически вычисленное время изменения текущей страницы сайта.

- Функция gmdate возвращает текущее время по Гринвичу в формате Day, DD Mon YEAR HH:MM:SS GMT.

Все сделали, проверили на валидаторе http://last-modified.com/ru/.

Получилось так что Last-Modified показывает дату последнего изменения 23 июня 2014 годы для всех страниц, т.е. все страницы сайта стали в глазах ПС( поисковых систем)как не изменившиеся, даже если какие-то изменения провести, то всё равно валидатор показывает, что страница не менялась с 23 июня. А это чревато последствиями, т.к. ПС не будут индексировать страницы сайта, даже если они изменились или добавились новые.

В чём проблема может быть? Я уверен что много кто настраивал этот заголовок, поделитесь пожалуйста, как делали и в чём моя ошибка, на что обратить внимание и т.д.

Mik Foxi
На сайте с 02.03.2011
Offline
1154
#1

filectime($_SERVER['SCRIPT_FILENAME']) - вам точно нужно проверять дату изменения файла текущего скрипта? скорее всего вам нужно брать дату изменения страницы из базы.

Антибот, антиспам, веб файрвол, защита от накрутки поведенческих: https://antibot.cloud/ Форум на замену серчу: https://foxi.biz/
siv1987
На сайте с 02.04.2009
Offline
427
#2

Вы отдает дату изменения исполняющего файла. Лучше не трогать эти заголовки если вы не знаете как правильно указать дату последнего изменения.

М
На сайте с 05.02.2014
Offline
30
#3
Между тегами <head>…</head>

Отдача заголовка Last-Modified происходит в интервале между передачей тегов <HEAD>?

---------- Добавлено 02.09.2014 в 21:27 ----------

А, я понял, откуда вы, возможно, взяли этот пример.

Вроде бы у вас сайт из статических страниц. Тогда изменения самого файла меняет дату модификации html-страницы.

Хотя не... ведь в этом случае ваши страницы — просто статика безскриптовая.

L
На сайте с 07.12.2007
Offline
351
#4
MALTIZER:
Нужно сделать так чтобы в ответ на запрос пользователя или поискового робота сервер отдавал заголовок Last-Modified, который говорит клиенту (поисковому роботу/посетителю сайта) о времени последнего изменения страницы.
В общем, нашёл инструкцию, вроде всё просто нужно вставить вот этот код:
if ($IfModifiedSince && $IfModifiedSince >= $LastModified_unix) {
header($_SERVER['SERVER_PROTOCOL'] . ' 304 Not Modified');
exit;}

1. Это некорректный код, решение отдавать заголовок "304 Not Modified" или "200 OK" принимается по более сложному условию.

2. Тупо слать LastModified при каждом обращении к серверу - бессмысленно и ничего не даст. Кэширование на стороне клиента работает не так:

Если при обращении к серверу был прислан заголовок If-Modified-Since(с датой локального кэша страница у пользователя/робота ПС), то:

- если страница не изменилась с этой даты - сервер отправляет заголовок "304 Not Modified" НЕ ПРИСЫЛАЯ ТЕКСТ САМОЙ СТРАНИЦЫ!

- если страница изменилась - сервер отправляет LastModified, код "200 OK" и ТЕКСТ САМОЙ СТРАНИЦЫ.

Если при обращении к серверу заголовок If-Modified-Since не прислан - клиент не поддерживает кэширование и LastModified отсылать ему бессмысленно, ему всегда оправляется страница сайта.

Хотя по RFC для HTTP1.1 Серверы HTTP/1.1 должны посылать поле Last-Modified всякий раз, когда это возможно.

MALTIZER:
Все сделали, проверили на валидаторе http://last-modified.com/ru/.Получилось так что Last-Modified показывает дату последнего изменения 23 июня 2014 ....

Я проверила сей сервис "изнутри" - он работает почти корректно:

- сначала посылает запрос для определения даты изменения документа

- потом второй запрос: IfModifiedSinse с этой датой и ловит ответ "304 Not Modified".

Но, судя по предлагаемому этим сервисом PHP-скрипту отдачи заголовков lastModified, создатель сервиса сам до конца не понимает принципы кэширования на стороне клиента.

Поэтому сервис не отрабатывает проверку корректности полученной даты сервером. Для полной проверки надо слать ещё 2 запроса - с датой из будущего и просто некорректной датой. И проверять код ответа сервера на 304/200.

Маркус:
А, я понял, откуда вы, возможно, взяли этот пример.
Вроде бы у вас сайт из статических страниц. Тогда изменения самого файла меняет дату модификации html-страницы.

Для "статики" мутить это бессмысленно - ЛастМодифайд корректно отдаёт сам веб-сервер, беря её из даты последнего изменения файла.

При этом, для статических файлов веб-сервер автоматически поддерживает и второй более гибкий вариант кэширования IfNoneMatch - Etag:

ETag может быть «строгим» (два документа имеют одинаковые ETags только если они совпадают побитово) или «нестрогим» (два документа имеют одинаковые ETags если они совпадают по содержанию, но могут отличаться в незначительных деталях).

MALTIZER
На сайте с 27.12.2012
Offline
76
#5
Ladycharm:
1. Это некорректный код, решение отдавать заголовок "304 Not Modified" или "200 OK" принимается по более сложному условию.
2. Тупо слать LastModified при каждом обращении к серверу - бессмысленно и ничего не даст. Кэширование на стороне клиента работает не так:

Ladycharm, я правильно понимаю, что достаточно воспользоваться решением, которое дано в статье (по ссылке, которую вы дали) и сервер будет отдавать правильный ответ в зависимости от того изменилась страница или нет?

Сейчас ситуация такая – если проверять сервисом http://last-modified.com/ru/ то last-modified выдаёт правильный, но почему-то всегда говорит, что страница не изменилась, даже если она совсем новая (ответ 304 Not Modified)

Вот, например, для этой страницы http://calcsoft.ru/kalkulatori-vkladov-bankov , если не трудно посмотрите пожалуйста.

MALTIZER
На сайте с 27.12.2012
Offline
76
#6

Продолжаю разбираться с настройкой last-modified самостоятельно.

Сейчас сервер отдаёт клиенту правильный last-modified, но также есть ещё

один заголовок:

Cache-Control: no-cache – означает, что кэш, к которому обращается

клиент, должен вновь запросить документ у сервера, с которого он был

получен.

Вопрос такой:

Для правильной работы, этот заголовок нужно убрать или как-то настроить по другому? Ведь, если я правильно понимаю, сейчас страница не кэшируется, а значит и last-modified не работает в полной мере?

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий