Уважаемые пользователи Голос!
Сайт доступен в режиме «чтение» до сентября 2020 года. Операции с токенами Golos, Cyber можно проводить, используя альтернативные клиенты или через эксплорер Cyberway. Подробности здесь: https://golos.io/@goloscore/operacii-s-tokenami-golos-cyber-1594822432061
С уважением, команда “Голос”
GOLOS
RU
EN
UA
vp-webdev
6 лет назад

304 не менее важен, чем 200 и даже 404


Сегодня поговорим об 304 ответе сервера. Для чего он нужен, как его можно реализовать.

Назначение

Редко можно встретить, чтобы кто-то, где-то, когда-то говорил об этом. На самом деле 304 ответ это хорошо. Он говорит о том, что страница сайта не изменялась. Получая данный заголовок, браузер или поисковый робот, получает команду, что заново загружать страницу с сервера не нужно.

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

Браузер отдаст страницу из памяти не тратя время на лишний запрос к серверу, а поисковый робот просто напросто пройдет мимо этой страницы и будет индексировать другие страницы. Не забываем, ведь боты имеют ограничения на обход одного сайта за раз. Но не только "клиент" получает выгоду, но и сервер, потому что количество запросов к нему снижается в разы.

Как реализовать

Вообще каждая cms или фреймворк имеет такую функцию. Необходимо просто установить какой-нибудь модуль или компонент.

function lastModified($gmdate) {
    $IfModifiedSince = false;
    if (isset($_ENV['HTTP_IF_MODIFIED_SINCE']) or isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
        $IfModifiedSince = strtotime(substr(($_ENV['HTTP_IF_MODIFIED_SINCE'] ? $_ENV['HTTP_IF_MODIFIED_SINCE'] : $_SERVER['HTTP_IF_MODIFIED_SINCE']), 5));
    }
    if ($IfModifiedSince && $IfModifiedSince >= strtotime($gmdate)) {
        header($_SERVER['SERVER_PROTOCOL'].' 304 Not Modified');
        exit;
    }
    header('Last-Modified: '.$gmdate);
}

Выше реализация на чистом php. Тут мы проверяем есть ли переменная в окружении, содержащяя в себе время последнего изменения страницы. Такой код используется в разделе новости одного из рабочих сайтов. Как можно увидеть, страницы отдаются мгновенно.

Например, на yii2 можно реализовать следующим образом:

public function behaviors()
{
    return [
        [
            'class' => 'yii\filters\HttpCache',
            'only' => ['index'],
            'lastModified' => function ($action, $params) {
                $q = new \yii\db\Query();
                return $q->from('post')->max('updated_at');
            },
        ],
    ];
}

Пропишем поведение(behaviors) вернем класс, на какой action распространяется ответ и callback. В callback запрос к базе, получаем самое последнее время изменения записи в таблице, в нашем случае post.

Итог

Подытоживаем, 304 ответ позволяет:

  • сэкономить ресурсы сервера
  • увеличить скорость отдачи страницы
  • ускорить индексацию поисковиками

И поэтому 304 ответ сервера должен быть обязательным на сайте, наравне с 200 и 404.

Материал подготовлен автором @zheev

3
189.775 GOLOS
На Golos с August 2017
Комментарии (7)
Сортировать по:
Сначала старые