Корректный Last-Modified

 
+
-
edit
 

Balancer

администратор
★★★★★
В базовой версии форумов 1.x и 2.x скрипт форума всегда возвращает текущую время/дату, что для страниц форума может быть плохо, например, с точки зрения поисковых систем, в частности - для локального поиска.

Для страниц с сообщениями можно возвращать в качестве времени последней модификации время последнего ответа в тему.

Делается это так (для версии 2.0. В версиях 1.x аналогично исправляется один файл - sources\Topics.php).

Открываем файл sources\lib\topic_linear.php
Ищем
code text
  1.         //-------------------------------------
  2.         // Format and print out the topic list
  3.         //-------------------------------------


После этих строк вписываем
code text
  1.         $max_time = 0;


Следом идёт
code text
  1.         while ( $row = $DB->fetch_row( $oq ) )
  2.         {


после них (внутри цикла уже) вписываем
code text
  1.             if($row['post_date']>$max_time)
  2.                 $max_time = $row['post_date'];


Ищем
code text
  1.         //-------------------------------------
  2.         // Print the footer
  3.         //-------------------------------------


перед этими строками вписываем
code text
  1.         header ('Last-Modified: '.gmdate('D, d M Y H:i:s',$max_time).' GMT');


Сохраняем изменения.

Открываем lib\topic_threaded.php
Аналогично. Ищем
code text
  1.         //-------------------------------------
  2.         // Format and print out the topic list
  3.         //-------------------------------------


дописываем ниже
code text
  1.         $max_time = 0;


дальше идёт
code text
  1.         while ( $row = $DB->fetch_row() )
  2.         {


дописывем ниже
code text
  1.             if($row['post_date']>$max_time)
  2.                 $max_time = $row['post_date'];


ищем
code text
  1.         //--------------------------------------------
  2.         // Sort out pagination
  3.         //--------------------------------------------

перед этими строками вписываем тоже
code text
  1.         header ('Last-Modified: '.gmdate('D, d M Y H:i:s',$max_time).' GMT');


Всё. Теперь форум возвращает корректные Last-Modified:
code text
  1. M:\...ru\all-forums\forums-1.2-balancer\sources>r "http://forums.airbase.ru/index.php?showtopic=1"
  2. --11:05:23--  http://forums.airbase.ru:80/index.php?showtopic=1
  3.            => `index.php?showtopic=1'
  4. Connecting to forums.airbase.ru:80... connected!
  5. HTTP request sent, fetching headers...
  6. 1 HTTP/1.1 200 OK
  7. 2 Date: Wed, 21 Jul 2004 07:05:22 GMT
  8. 3 Server: Apache/2.0.50 (Unix) PHP/4.3.7
  9. 4 X-Powered-By: PHP/4.3.7
  10. 5 Content-Language: ru, ru
  11. 6 Set-Cookie: session_id=378e45e764f2e2847c885f095ee1d463; path=/; domain=.airbase.ru
  12. 7 Set-Cookie: modpids=deleted; expires=Tue, 22-Jul-2003 07:05:22 GMT; path=/; domain=.airbase.ru
  13. 8 [b]Last-Modified: Mon, 28 Apr 2003 08:45:49 GMT[/b]
  14. 9 Cache-Control: no-cache, must-revalidate, max-age=0
  15. 10 Expires: Mon, 26 Jul 1997 05:00:00 GMT
  16. 11 Pragma: no-cache
  17. 12 Connection: close
  18. 13 Content-Type: text/html;charset=utf-8
  19. 14
  20. 200 OK
 
RU slipstream #22.01.2005 23:07
+
-
edit
 

slipstream

втянувшийся
Это был окончательный вариант модификации?

Т.е. правильно ли я заметил эффект — в случае обновления любого постинга, находящегося на запрашиваемой странице, Last-Modified не изменяется и соответственно броузер перегружает страницу из кеша со старым вариантом постинга?
Это сообщение редактировалось 22.01.2005 в 23:13
RU Balancer #22.01.2005 23:43  @slipstream#22.01.2005 23:07
+
-
edit
 

Balancer

администратор
★★★★★
slipstream> Т.е. правильно ли я заметил эффект — в случае обновления любого постинга, находящегося на запрашиваемой странице, Last-Modified не изменяется и соответственно броузер перегружает страницу из кеша со старым вариантом постинга? [»]

Дата подставляется по дате создания последнего постинга. По-другому (последняя дата модификации, если она есть, иначе - последнее создание постинга) - слишком накладно будет :)
 
+
-
edit
 

Balancer

администратор
★★★★★
Если в конце вместо
code php
  1. header ('Last-Modified: '.gmdate('D, d M Y H:i:s',$max_time).' GMT');

написать
code php
  1.         $last_modify = gmdate('D, d M Y H:i:s',$max_time).' GMT';
  2.         $hdr = getallheaders();
  3.         if($hdr['If-Modified-Since'] == $last_modify)
  4.         {
  5.             header("HTTP/1.1 304 Not Modified");
  6.             exit("Not modified since $last_modify");
  7.         }
  8.  
  9.         header ('Last-Modified: '.$last_modify);

то форум начнёт обрабатывать ещё и запрос браузера (или прокси) If-Modified-Since. Если со времени даты документа в кеше страница не обновлялась, то передавать её не нужно.
 
RU slipstream #02.02.2005 17:02
+
-
edit
 

в начало страницы | новое
 
Поиск
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru