Как отдавать поисковикам Last-Modified динамических страниц?

AB
На сайте с 06.07.2004
Offline
45
10652

Имеется сайт на хостинге, который отдает поисковикам только объем shtml-документа (проверено Google и Яндексом). Дату их изменения - не фиксирует.

Можно ли как-то настроить Апач, чтобы было все ОК?

Спрашиваю это потому, что на другом хостинге - все по дефолту работает, например для phtml страниц с параметрами.

Еще вариант - может быть сгенерировать правильный header средствами SSI, но как?

Или остается только встраивать в шаблон PHP-код типа такого:

header('Last-Modified: '.date('r', time()-60*60*24+rand(0, 60*60*5)));
re-pulse your mind (http://www.amontillado.ru)
Алексей Пешков
На сайте с 24.03.2004
Offline
47
#1

Это недостаток Вашего хостинга.

Пусть админы XBitHack настраивают в Апаче.

lexwrlk
На сайте с 12.10.2005
Offline
130
#2

может я чего то не понимаю, но, как Апач может отдавать правильный Last-Modified для index.php?page=today_page если index.php редактировался скажем месяц назад? Откуда Апачу знать, что данные полученные из базы данных страницей добавлены(или редактировались) сегодня?

Если апач это действительно может, то хотелось бы знать как, сделал бы на своем сайте.

СДЛ СДЛу рознь (с) Форест Гамп
E
На сайте с 21.10.2005
Offline
59
#3

Пользуйтесь хидерами на PHP и будет Вам счастье:)

цццюнфтвучюкг (http://opechat.ca/perevod/yandex_ru/) и нфтвучюкг (http://opechat.ca/perevod/yandex_ru/) - это диагноз!
bondarev.pp.ru
На сайте с 29.09.2005
Offline
202
#4

Есть несколько способов. Лучше всего сделать буферизацию вывода, и (когда контент сгенерен) пройтись по списку get_included_files(), найти из всех подключеных файлов того, который изменен последним и выдавать дату его модификации. В случае, если данные берется из БД, нужно иметь дату последнего обновления для каждой строчки.

Второй способ (по-моему, лучше): тоже буферизовать вывод и иметь для каждого URLа, например, MD5 хэш с датой последнего изменения. При каждом запросе сверять хэш, если не изменился - выдавать дату которая есть. Если изменился - сохранять новый и отдавть time().

bondarevpipes.com (http://ru.bondarevpipes.com/)
[Удален]
#5
Второй способ (по-моему, лучше): тоже буферизовать вывод и иметь для каждого URLа, например, MD5 хэш с датой последнего изменения. При каждом запросе сверять хэш, если не изменился - выдавать дату которая есть. Если изменился - сохранять новый и отдавть time().

Это кстати некоторый софт автоматом умеет делать. Но к сожалению метод в реальности мало полезен - очень часто на динамических страницах встречаются динамические же участки - несколько байт поменяются - и хана.

AB
На сайте с 06.07.2004
Offline
45
#6
lexwrlk:
может я чего то не понимаю, но, как Апач может отдавать правильный Last-Modified для index.php?page=today_page если index.php редактировался скажем месяц назад? Откуда Апачу знать, что данные полученные из базы данных страницей добавлены(или редактировались) сегодня?
Если апач это действительно может, то хотелось бы знать как, сделал бы на своем сайте.

Сам удивлен, но факт. Цитирую Яндекс:


www.***.ru/portfolio.phtml?lang=rus (7 КБ) · 10.12.2005
www.***.ru/logo.phtml?lang=eng (6 КБ) · 08.09.2005

Страницы динамические, контент выводится из текстовой базы.

На других сайтах этого хостинга - аналогичная ситуация.

Надо распросить хостеров, как они этого добились.

Ответ хостера:

все просто - такова особенность веб-сервера, Russian Apache
[Удален]
#7
Atomic Bombermа:
Сам удивлен, но факт. Цитирую Яндекс:

www.***.ru/portfolio.phtml?lang=rus (7 КБ) · 10.12.2005
www.***.ru/logo.phtml?lang=eng (6 КБ) · 08.09.2005

Страницы динамические, контент выводится из текстовой базы.
На других сайтах этого хостинга - аналогичная ситуация.
Надо распросить хостеров, как они этого добились.
Ответ хостера:

Apache может сам давать дату LastModified, но берёт он её из даты файла). Поэтомы это грамотно работает для СТАТИЧЕСКИХ страниц.

Такое в принципе можно настроить и для ДИНАМИЧЕСКИХ страниц (SSI, CGI, PHP), но бессмысленно брать дату изменения файла - контент, отдаваемый пользователю, фактически создается в момент обращения к странице, поэтому дата модификации непосредственно самого файла скрипта или SSI-страницы теряет практический смысл.

Для SSI-документов:

Для "server-parsed" документов веб-cервер Apache будет выдавать "Last-Modified" в том случае, если указана директива "XBitHack full" (например, в файле .htaccess), и для файла, к которому происходит обращение, выставлен атрибут "исполняемый" для группы (команда Unix-shell "chmod g+x имя_файла").

Для скриптов на языке PHP:

Различные HTTP-заголовки нужно задавать с помощью функции header(), которая должны вызываться до вывода каких-либо данных скриптом:

<?php
$lastmodified = mktime(15, 26, 11, 1, 12, 2006);// hour, minute, second, month, day, year
header("Last-Modified: " . $lastmodified." GMT");
?>

Можно так же отдать CharSet:

header("Content-Type: text/html; charset=windows-1251");

Для скриптов на языке Perl:

#!/usr/local/bin/perl
use POSIX qw(strftime);
my $LM = strftime "%a, %e %b %Y %H:%M:%S GMT", gmtime(time());
print "Last-Modified: $LM ";

А над Apache-ем издеваться смысла нет - весь хостинг будет искорёжен.

Проще делать программно, раз у Вас динамические страницы - или "грамотно" определять все изменения дат файлов и баз данных, как предложили выше, или "тупо" отслеживать и менять "ручками" (Уж выдавать дату изменения самого файла - пара строк на php, Яндекс "кушает", как миленький :), Google, думаю, тоже - откуда ему знать, кто ему Хеадеры шлёт).

А если Ваш хостер будет слать LastModified динамических страниц за Вас, от него надо "сваливать" - контент поменяется, а Яндекс будет думать, что он остался старый. Надо иметь рычаги воздействия на поисковики в своих руках ;)

AB
На сайте с 06.07.2004
Offline
45
#8

спасибо за ценную информацию.

Сделаю выводы для себя.

Кстати, обнаружен сервис Узнайте, что возвращает веб-сервер в заголовке ответа

[Удален]
#9

Удобная штучка, спасибо. Еще бы она показывала Редиректы по дороге к страничке - было бы интереснее...

Кстати, обнаружил, что CharSet по "header("Content-Type: text/html; charset=windows-1251");" страница на PHP не отдаёт, его отдаёт сам Apache - значит это надо .htaccess править, не прав я был в своём предыдущем посте.😮

А строки типа:

<?php
$lastmodified = mktime(15, 26, 11, 1, 12, 2006);// hour, minute, second, month, day, year
header("Last-Modified: " . gmdate("D, d M Y H:i:s", $lastmodified) . " GMT");
?>

надо писать в самом начале выдачи страницы, еще до

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

иначе Last-Modified не отдаётся.

AB
На сайте с 06.07.2004
Offline
45
#10

Да, я бегло по док-ции пробежался, наваял на скорую руку такой код:

last_modified.php

<?

$filename = $REDIRECT_SCRIPT_NAME;
$filename = substr($filename , 1);
$file_date = date("r", filemtime($filename));
header('Last-Modified: '.$file_date);
?>

test.shtml

<!--#include virtual="last_modified.php"-->

....
HTML-код

Вылезают следующие проблемы:

1. Пока не разобрался, как генерить не местное время, как сейчас у меня вычесляется дата, а по Гринвичу, т.е. в таком виде: Wed, 01 Feb 2006 10:30:26 GMT.

2. Когда залил файлы на сервер хостера - оказалось, что у них PHP (посмотрел по phpinfo()) не знает переменной $REDIRECT_SCRIPT_NAME, аналога которой не нашел. А весь сок скрипта в том, чтобы вставить его в шаблон один раз, а он определял бы дату последней модификации файлов страниц автоматически.

3. Самое главное - если смотреть, что выдает в заголовке test.shtml, то оказывается, что Last modified там почему-то нет! А если вызывать last_modified.php, то показывает! Как быть? Не могу я несколько сотен файлов из SHTML в PHP перегонять, страницы хорошо проиндексированы.

Беда, прям.

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