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

Тема в разделе "Вопросы новичков", создана пользователем epifan, 1 фев 2009.

Статус темы:
Закрыта.
  1. epifan

    epifan Создатель

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

    К сожалению я ещё тупой в плане php, потому полуфабрикаты довести до готового решения не получается.

    Из того, что удалось найти своими силами,


    http://www.controlstyle.ru/articles/programming/text/if-mod-since-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. Проверяю заголовки тута:

    http://www.promoting.ru/http_headings/
     
Статус темы:
Закрыта.