Полезные статьи по разработке сайта на системе управления 1С-Битрикс. Программирование. Верстка.

Вывод HTTP заголовка Last-Modified и If-Modified-Since в 1С-Битрикс

  291

Заголовок Last-Modified система управления 1С-Битрикс "по умолчанию из коробки" не передает. Это одна из "SEO-проблем" 1С-Bitrix. Обсуждение этого вопроса уже давно ведется на форуме разработчиков.

Представлю вашему вниманию готовый код, он будет работать если хотя бы один стандартный компонент заполняет время модификации страницы. В компонентах должна быть включена опция "Устанавливать в заголовках ответа время модификации страницы".  Это один из способов передать заголовок 304 Not Modified на запрос If-Modified-Since.

Это готовый код, он будет работать если хотя бы один стандартный компонент заполняет время модификации страницы.

Вот код который использую я на сайтах (работает он и в случае с NGINX). Что бы не модифицировать ядро этот участок кода вставляете в файл /bitrix/admin/php_interface/init.php. Если нет такого файла, то вам необходимо создать его.

 use \Bitrix\Main\EventManager,
	\Bitrix\Main\Context;

/**
 * Отвечает на заголовок If-Modified-Since
 */
EventManager::getInstance()->addEventHandler("main", "OnEndBufferContent", "setIfModifiedSince");

class bxHttpResponse extends \Bitrix\Main\HttpResponse
{
	function getLastModified($obj)
	{
		return $obj->lastModified;
	}
}

function setIfModifiedSince() {
	if (function_exists('apache_request_headers')) {
		$arHeaders = array_change_key_case(apache_request_headers(), CASE_UPPER);
		
		if ($ifModifiedSince = $arHeaders['IF-MODIFIED-SINCE']) {
			$date = \DateTime::createFromFormat(
				"D, d M Y H:i:s T",
				$ifModifiedSince
			);
			$ob = new bxHttpResponse;
			if ($lastModified = $ob->getLastModified(Context::getCurrent()->getResponse())) {
				if ($date->getTimestamp() > $lastModified->getTimestamp()) { // Прямое сравнение не работает :(
					Context::getCurrent()->getResponse()->setStatus("304 Not Modified");
				}
			}
		}
	}
}