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