304 Not Modified найден!

3k
Алексей,
304 Not Modified найден!

Придумал еще один способ отдать заголовок 304 Not Modified на запрос If-Modified-Since, правда пришлось извернуться, чтобы достать время модификации страницы из ядра битрикс.

Придумал еще один способ отдать заголовок 304 Not Modified на запрос If-Modified-Since, правда пришлось извернуться что бы достать время модификации страницы из ядра битрикс.

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

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


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");
				}
			}
		}
	}
}

Есть вопросы или нашли ошибку? Напишите комментарий (можно без регистрации), отвечать стараюсь быстро.

Опубликовано 13 сентября 2019 | Обновлено 23 марта 2022
seo, 304
Поделиться
Похожие статьи
Как сделать 304 заголовок на 1С-Битрикс
Варианта 3: простой, с помощью готового модуля или через композит.
Читать дальше » 0
Алексей,
Комментарии
❮…❯
Авторизуйтесь чтобы получать уведомления об ответе
11 фев 2020
Описался, прошу прощения. Свойство lastModified "защищенное", но не суть. Спасибо!
Алексей
11 фев 2020
Dvash, кажется сам вопрос где-то потерялся или я не понял о чем речь
11 фев 2020
Алексей, Видимо, не отправилось)))Писал, что решал такую задачу похоже, но через получение доступа к защищённому свойству класса HttpResponse. Ваш вариант лучше. Спасибо, еще раз!
Алексей
11 фев 2020
Dvash, да не за что, рад что кому-то пригодилось
12 фев 2020
Алексей, возможно, стоит сделать проверку наличия If-Modified-Since регистронезависимой, т.к. заголовки могут приходить в любом регистре. Как вариант, привести $arHeaders к одному регистру, перед проверкой.
Алексей
12 фев 2020
Dvash, да, хорошая идея, спасибо. Обновил код.
Придумал еще один способ отдать заголовок 304 Not Modified на запрос If-Modified-Since, правда пришлось извернуться, чтобы достать время модификации страницы из ядра битрикс.