Учим PHPBB3 отвечать на HTTP_IF_MODIFIED_SINCE

в 20:59, , рубрики: cms, php, phpbb3, метки:

В общем, нигде не нагуглил почему bb3 не не отвечает на запрос HTTP_IF_MODIFIED_SINCE и не отдает заголовок Last-Modified.
А поисковики это дело любят, потому что время обработки страницы иногда сокращается в разы(не нужно сверять контент).
После изучения проблемы и копания в коде созрело решение.
Допилить самому.

В файле functions.php, в районе строки

header('Pragma: no-cache');

Ниже вставляем:

$pchanged=0;
if ($topic_id<1)
{
if ($forum_id>0)
{
$sql = 'SELECT forum_last_post_time
FROM '. FORUMS_TABLE. '
WHERE forum_id='.$forum_id;
$result = $db->sql_query_limit($sql, 1, 0, 600);
$pchanged = $db->sql_fetchfield('forum_last_post_time');
$db->sql_freeresult($result);
} else
{
$sql = 'SELECT MAX(forum_last_post_time) as forum_last_post_time
FROM '. FORUMS_TABLE;
$result = $db->sql_query_limit($sql, 1, 0, 600);
$pchanged = $db->sql_fetchfield('forum_last_post_time');
$db->sql_freeresult($result);
}
} else
{
$sql = 'SELECT topic_last_post_time
FROM '. TOPICS_TABLE. '
WHERE forum_id='.$forum_id. ' and topic_id='.$topic_id;
$result = $db->sql_query_limit($sql, 1, 0, 600);
$pchanged = $db->sql_fetchfield('topic_last_post_time');
$db->sql_freeresult($result);
}

$if_modified_since = isset($_SERVER[«HTTP_IF_MODIFIED_SINCE»])? preg_replace('/;.*$/', '', $_SERVER[«HTTP_IF_MODIFIED_SINCE»]): '';
$gmdate_mod = gmdate('D, d M Y H:i:s', $pchanged). ' GMT';
if ($if_modified_since >= $gmdate_mod) {
header(«HTTP/1.0 304 Not Modified»);
exit;
}
header(«Last-Modified: $gmdate_mod»);

Код грязноват, можно и пооптимизировать — это на Ваш вкус. И так работет.
Если в урле не указан id форума(1я страница) — берется последнее время поста в форуме вообще.
Если указан топик то берется время последнего поста этого топика.
Еще можно запилить проверку текущей страницы топика, итп… Кто допилит — отпишитесь pls. ;)

Автор: crrr

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js