epifan
Создатель
- Регистрация
- 22 Апр 2007
- Сообщения
- 31
- Реакции
- 31
- Автор темы
- #1
У кого-нибудь есть решение для правильной обработки If-modified-since для поисковиков? — если страница не изменялась выдавать 304 Not Modified, если изменялась - выдавать 200 ОК.
К сожалению я ещё тупой в плане php, потому полуфабрикаты довести до готового решения не получается.
Из того, что удалось найти своими силами,
— не работает, всегда возвращает 200 ОК, т.е. страница менялась.
Ниже приведён пример PHP-функции для принятия решения о возвращении кода 304 или 200 в зависимости от присланных в запросе GET или HEAD заголовков Last-Modified и/или If-None-Match.
Но как из этой функции получить правильный ответ поисковику/браузеру, не понимаю, не хватает знаний.
Вопрос в этой ветке, т.к. это непосредвтвенно связано с корректной и более эффективной обработкой сайта поисковыми системами + наверняка в своё время обсуждалась многократно.
Вопрос с виду простой и типовой, но, к сожалению так и не удалось найти готового работающего решения.
P.S. Проверяю заголовки тута:
К сожалению я ещё тупой в плане php, потому полуфабрикаты довести до готового решения не получается.
Из того, что удалось найти своими силами,
Для просмотра скрытого содержимого вы должны войти или зарегистрироваться.
— не работает, всегда возвращает 200 ОК, т.е. страница менялась.
Ниже приведён пример PHP-функции для принятия решения о возвращении кода 304 или 200 в зависимости от присланных в запросе GET или HEAD заголовков Last-Modified и/или If-None-Match.
Но как из этой функции получить правильный ответ поисковику/браузеру, не понимаю, не хватает знаний.
Код:
<?php
.// $last_modified - дата последней модификации документа на сервере, Unix Timestamp. Default -текущая
.// $etag = текущий ETag документа на серверре, default = ""
.// return TRUE - обновить страницу (200 ОК), FALSE - не обновлять (304 Not Modified)
function MakeHeaders($last_modified = "", $etag="") {
global $_SERVER;
$refresh = TRUE;
if ($last_modified == "") $last_modified = time();
$none_match = (isset($_SERVER['HTTP_IF_NONE_MATCH'])) ?$_SERVER['HTTP_IF_NONE_MATCH'] :"";
$modified_since = (isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])) ?$_SERVER['HTTP_IF_MODIFIED_SINCE'] :"";
if($modified_since) { // BUG: NetScape sends ";lenght = xxx" after the date
$arraySince = explode(";", $modified_since);
$since = strtotime($arraySince[0]);
}
switch (TRUE) {
case (!$none_match && $modified_since):
if ( ($since <= time())
&& is_int($since)
&& ($since >= $last_modified) ) {
return FALSE;
}
break;
case ($none_match):
if ($modified_since) { // Проверка и по If-None-Match, и по If-Modified-Since
if (($since > time()) || !is_int($since)
|| ($since < $last_modified)) break; // Файл в кеше клиента устарел по If-Modified-Since
}
.// Проверку If-Modified-Since, если она была - прошли. Проверка по If-None-Match:
if ($etag == "") break;
$INM = split('[,][ ]?', $none_match);
foreach($INM as $enity) {
if ($enity=="\"$etag\"" || $enity=="\"*\"")
return FALSE; // 304 Not Modified
}
break;
default: ; // Conditional Get не задан - просто отдаем страницу.
}
return TRUE; // Страница изменилась (200 ОК)
}
?>
Вопрос в этой ветке, т.к. это непосредвтвенно связано с корректной и более эффективной обработкой сайта поисковыми системами + наверняка в своё время обсуждалась многократно.
Вопрос с виду простой и типовой, но, к сожалению так и не удалось найти готового работающего решения.
P.S. Проверяю заголовки тута:
Для просмотра скрытого содержимого вы должны войти или зарегистрироваться.