Битрикс: устанавливаем If-Modified-Since заголовки
Последние записи
Заголовок Last-Modified
достаточно частое пожелание seo специалистов. К сожалению, Битрикс из коробки не позволяет задавать заголовки last-modified. Поэтому я применил трюк: разбил все страницы на 2 логических типа - статические и динамические.
- Для статических страниц устанавливаю заголовок по времени последней модификации файла в котором они находятся.
- Для динамических страниц в каждом шаблоне вывожу последнюю модификацию страницы по времени добавления последнего элемента или его обновления.
Обеспечиваем отдачу заголовков
В init.php
пишем
/*Выставляем заголовки if-modified-since */
require($_SERVER['DOCUMENT_ROOT'].'/local/libs/if-modified-since.php');
В if-modified-since.php
/*Выставляем заголовки if-modified-since */
AddEventHandler('main', 'OnEpilog', array('CBDPEpilogHooks', 'CheckIfModifiedSince'));
class CBDPEpilogHooks
{
function CheckIfModifiedSince()
{
GLOBAL $lastModified;
if (!$lastModified) $lastModified=time()-rand(1000, 100000);
if ($lastModified)
{
header("Cache-Control: public");
header('Last-Modified: '.gmdate('D, d M Y H:i:s', $lastModified).' GMT');
if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) >= $lastModified) {
header('HTTP/1.1 304 Not Modified'); exit();
}
}
}
}
If-Modified-Since
для статических страниц
Где-нибудь в файле пишем.
GLOBAL $lastModified;
if (!$lastModified){
$lastModified = strtotime(date("D, d M Y H:i:s", filectime($_SERVER['SCRIPT_FILENAME'])));
}else{
$lastModified = max($lastModified, MakeTimeStamp($arResult['TIMESTAMP_X']));
}
If-Modified-Since
для динамических страниц со списком элементов
В result_modifier.php
if(!empty($arResult['ITEMS'])){
$time = strtotime("-5 years", time());
$date = date("Y-m-d", $time);
$dat['DATE'] = $date;
foreach ($arResult['ITEMS'] as $key => $value){
if($value['DATE_CREATE'] && strtotime($dat['DATE'])<strtotime($value['DATE_CREATE'])){
$dat['DATE'] = $value['DATE_CREATE'];
}
if($value['TIMESTAMP_X'] && strtotime($dat['DATE'])<strtotime($value['TIMESTAMP_X'])){
$dat['DATE'] = $value['TIMESTAMP_X'];
}
}
$this->__component->arResult["LAST_MODIFY"] = $dat['DATE'];
$this->__component->SetResultCacheKeys(array("LAST_MODIFY"));
}
В component_epilog.php
GLOBAL $lastModified;
$lastModified = strtotime($arResult['LAST_MODIFY']);
If-Modified-Since
для детальных страниц комплексных компонентов
В component_epilog.php
GLOBAL $lastModified;
$m = $arResult['TIMESTAMP_X'] ? $arResult['TIMESTAMP_X'] : $arResult['DATE_CREATE'];
if (!$m){
$lastModified = strtotime(date("D, d M Y H:i:s", filectime($_SERVER['SCRIPT_FILENAME'])));
}else{
$lastModified = MakeTimeStamp($m);
}
Не забудьте в настройках комплексных компонентов выбирать в полях для показа "Дату создания" и "Дату изменения"
После добавления кода потребуется обновить кеш компонентов или вовсе сбросить его
Совместимость данного решения с композитом не тестировал
Проверить возвращаемые заголовки лучше всего здесь: Last-Modified.com
Решение применялось на редакции Бизнес v17.5.4
Комментарии