Правильная обработка If-modified-since

Статус
В этой теме нельзя размещать новые ответы.

epifan

Создатель
Регистрация
22 Апр 2007
Сообщения
31
Реакции
31
У кого-нибудь есть решение для правильной обработки If-modified-since для поисковиков? — если страница не изменялась выдавать 304 Not Modified, если изменялась - выдавать 200 ОК.

К сожалению я ещё тупой в плане 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. Проверяю заголовки тута:

 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху