Функция cot_sendheaders в Cotonti

Функция cot_sendheaders отправляет стандартные HTTP-заголовки и отключает кэш браузера для обеспечения актуальности контента. Она также включает механизм проверки на изменение контента через заголовок Last-Modified и управляет кэшированием.

Код функции

/**
 * Sends standard HTTP headers and disables browser cache
 *
 * @param string $contentType Content-Type value (without charset)
 * @param string $responseCode HTTP response code, e.g. '404 Not Found'
 * @param int $lastModified Last modified time
 * @return bool
 */
function cot_sendheaders($contentType = 'text/html', $responseCode = '200 OK', $lastModified = 0)
{
    $protocol = (isset($_SERVER['SERVER_PROTOCOL'])) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.1';
    $lastModified = max((int) $lastModified, 0);
    if ($lastModified > 0) {
        $modifiedSince = isset($_ENV['HTTP_IF_MODIFIED_SINCE'])
            ? strtotime(substr($_ENV['HTTP_IF_MODIFIED_SINCE'], 5))
            : false;
        $modifiedSince = isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])
            ? strtotime(substr($_SERVER['HTTP_IF_MODIFIED_SINCE'], 5))
            : $modifiedSince;

        if ($modifiedSince && $modifiedSince >= $lastModified) {
            header($protocol . ' 304 Not Modified');
            exit;
        }
    } else {
        $lastModified = time() - 3600 * 12;
    }

    header($protocol . ' ' . $responseCode);
    header('Expires: Mon, Apr 01 1974 00:00:00 GMT');
    header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $lastModified) . ' GMT');
    if (!empty($contentType)) {
        header('Content-Type: ' . $contentType . '; charset=UTF-8');
    }
    header('Cache-Control: no-store,no-cache,must-revalidate');
    header('Cache-Control: post-check=0,pre-check=0', false);
    header('Pragma: no-cache');

    return true;
}


Параметры:

$contentType (string): Тип контента, который будет передан в заголовке Content-Type. Например, text/html, application/json и так далее.

$responseCode (string): HTTP-статусный код, который указывает на результат выполнения запроса. Например, '200 OK', '404 Not Found'.

$lastModified (int): Время последнего изменения контента в виде временной метки (timestamp). Если не задано, по умолчанию используется значение 0.


Описание работы:
Определение протокола:

Протокол HTTP, который использует сервер (обычно это будет HTTP/1.1), извлекается из переменной $_SERVER['SERVER_PROTOCOL'].

 

$protocol = (isset($_SERVER['SERVER_PROTOCOL'])) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.1';


Проверка на измененность контента:

Если задан параметр $lastModified (время последнего изменения контента), функция проверяет, был ли контент изменен с момента последнего запроса. Если контент не изменился (клиент послал заголовок If-Modified-Since), то сервер отправляет ответ 304 Not Modified, что указывает клиенту, что данные не изменялись, и не нужно загружать их заново.

if ($lastModified > 0) {
    $modifiedSince = isset($_ENV['HTTP_IF_MODIFIED_SINCE'])
        ? strtotime(substr($_ENV['HTTP_IF_MODIFIED_SINCE'], 5))
        : false;
    $modifiedSince = isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])
        ? strtotime(substr($_SERVER['HTTP_IF_MODIFIED_SINCE'], 5))
        : $modifiedSince;

    if ($modifiedSince && $modifiedSince >= $lastModified) {
        header($protocol . ' 304 Not Modified');
        exit;
    }
}


Если контент не изменился, функция сразу отправляет ответ с кодом 304, что предотвращает ненужную загрузку данных.

Отправка HTTP-заголовков:

Далее отправляются основные HTTP-заголовки:
Expires: Устанавливает дату, до которой контент считается устаревшим. В данном случае он всегда устарел (судя по значению Mon, Apr 01 1974 00:00:00 GMT), что говорит браузеру не кэшировать этот контент.
Last-Modified: Указывает время последнего изменения контента.
Content-Type: Устанавливает тип контента и кодировку (по умолчанию это UTF-8).
Cache-Control: Устанавливает правила кэширования для браузера, запрещая кэширование.
Pragma: Еще один заголовок для управления кэшированием, устаревший, но все еще используется для совместимости с HTTP/1.0.

header($protocol . ' ' . $responseCode);
header('Expires: Mon, Apr 01 1974 00:00:00 GMT');
header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $lastModified) . ' GMT');
if (!empty($contentType)) {
    header('Content-Type: ' . $contentType . '; charset=UTF-8');
}
header('Cache-Control: no-store,no-cache,must-revalidate');
header('Cache-Control: post-check=0,pre-check=0', false);
header('Pragma: no-cache');



Возврат результата:

Функция всегда возвращает true, подтверждая успешное выполнение.

return true;


Подытожим:

cot_sendheaders отправляет стандартные заголовки HTTP, чтобы отключить кэширование контента в браузере, и управляет заголовками для проверки на изменение контента через Last-Modified.

Это полезно, когда необходимо гарантировать, что браузер всегда получает актуальную версию контента и не использует кэшированные данные.


Также, если контент не изменился, сервер может отправить статус 304 Not Modified, чтобы сэкономить пропускную способность, не отправляя весь контент повторно.

Применение:
Эта функция полезна на страницах, где необходимо контролировать актуальность данных (например, динамичные страницы с обновляющимся контентом) и предотвратить их кэширование.

 

3 минут чтения Administrator

Комментарии (0)

Комментарии отсутствуют
Добавление комментариев доступно только зарегистрированным пользователям

Автор контента

Administrator

Оффлайн

Administrator

Последняя авторизация: 05.07.2026 18:32

  • Страница размещена: 21.01.2025 13:02
  • Последнее обновление: 21.01.2025 13:05