Большинство веб-мастеров сталкивается с проблемой как же настроить Last-Modified и If-Modified-Since для своего сайта. Для начал хотел бы объяснить что это за заголовки и для чего они нужны.
Для чего нужны заголовки Last-Modified и If-Modified-Since?
Заголовки Last-Modified и If-Modified-Since созданы для внесения информации о последнем редактировании веб-страницы. Будучи поисковым ботом или пользователь зашедшим на сайт впервые будет отдан код ответа 200, если же они зайдут повторно им будет отдан код ответа 304 Not Modified что означает — что страница не была изменена с последнего момента их посещения и повторной загрузки не требует.
Таким образом если мы настроим Last-Modified, мы получим такие преимущества:
— Ускорение загрузки сайта
— Уменьшение нагрузки на сервер
— Ускорение индексации страниц сайта
— Отображение последней даты изменения страницы в выдачи
Настройка Last-Modified для html сайта
Ниже прилагаю код, который подходит для статических сайтов, а точнее для html сайтов, этот код нужно вставить на каждую страницу и переименовать расширение файлов страниц с .html на .php (пример: страницу index.html нужно переименовать на index.php) чтобы все заработало.
1 2 3 4 5 6 7 8 9 10 11 12 | <?php $last_modified_time = getlastmod(); header("Cache-Control: public"); header("Expires: " . date("r", time()+10800)); if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) >= $last_modified_time){ header('HTTP/1.1 304 Not Modified'); die; /* убили всё, что ниже */ } header('Last-Modified: '.gmdate('D, d M Y H:i:s', $last_modified_time).' GMT'); ?> |
Настройка Last-Modified для Joomla
Сразу скажу что я не рекомендую устанавливать различные плагины, лучше это сделать в ручную.
Первый код нужно вставить в /templates/Название вашей темы/html/com_content/article/default.php после строчки defined(‘_JEXEC’) or die;
1 2 3 4 5 6 7 8 9 | JResponse::allowCache(true); $last_modified=strtotime($this->item->modified); JResponse::setHeader('Last-Modified',gmdate('D, d M Y H:i:s', $last_modified).' GMT',true); JResponse::setHeader('Cache-Control','public',true); if(isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE'])>=$last_modified){ header($_SERVER['SERVER_PROTOCOL'].' 304 Not Modified'); die; } |
Второй код нужно вставить в /templates/Название вашей темы/html/com_content/category/blog.php после строчки defined(‘_JEXEC’) or die;
1 2 3 4 5 6 7 8 9 10 11 | $last_modified=strtotime($this->category->modified_time); foreach($this->items as $post){ $lm=strtotime($post->modified); if($last_modified<$lm) $last_modified=$lm; } JResponse::setHeader('Last-Modified',gmdate('D, d M Y H:i:s', $last_modified).' GMT'); if(isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE'])>=$last_modified){ header($_SERVER['SERVER_PROTOCOL'].' 304 Not Modified'); die; } |

Если у вас нету папки com_content тогда:
1) Первый код нужно вставить в /components/com_content/views/article/tmpl/default.php после defined(‘_JEXEC’) or die;
2) Второй код нужно вставить в /components/com_content/views/category//tmpl/default.php после defined(‘_JEXEC’) or die;
Настройка Last-Modified для WordPress
Ниже прилагаю код который заработал на моем сайте и еще нескольких на движке WordPress, его нужно вставить wp-content/themes/Название вашей темы/functions.php в самом верху после открывающимся тегом <?php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | add_action( 'template_redirect', 'HTTP_Headers_Last_Modified' ); function HTTP_Headers_Last_Modified() { if ( ( defined( 'DOING_AJAX' ) && DOING_AJAX ) || ( defined( 'XMLRPC_REQUEST' ) && XMLRPC_REQUEST ) || ( defined( 'REST_REQUEST' ) && REST_REQUEST ) || ( is_admin() ) ) { return; } $last_modified = ''; // Для страниц и записей if ( is_singular() ) { global $post; if ( !isset( $post -> post_modified_gmt ) ) { return; } $post_time = strtotime( $post -> post_modified_gmt ); $modified_time = $post_time; // Если есть комментарий, обновляем дату if ( ( int ) $post -> comment_count > 0 ) { $comments = get_comments( array( 'post_id' => $post -> ID, 'number' => '1', 'status' => 'approve', 'orderby' => 'comment_date_gmt', ) ); if ( !empty( $comments ) && isset( $comments[0] ) ) { $comment_time = strtotime( $comments[0] -> comment_date_gmt ); if ( $comment_time > $post_time ) { $modified_time = $comment_time; } } } $last_modified = str_replace( '+0000', 'GMT', gmdate( 'r', $modified_time ) ); } // Cтраницы архивов: рубрики, метки, даты и тому подобное if ( is_archive() || is_home() ) { global $posts; if ( empty( $posts ) ) { return; } $post = $posts[0]; if ( !isset( $post -> post_modified_gmt ) ) { return; } $post_time = strtotime( $post -> post_modified_gmt ); $modified_time = $post_time; $last_modified = str_replace( '+0000', 'GMT', gmdate( 'r', $modified_time ) ); } // Если заголовки уже отправлены - ничего не делаем if ( headers_sent() ) { return; } if ( !empty( $last_modified ) ) { header( 'Last-Modified: ' . $last_modified ); if ( isset( $_SERVER['HTTP_IF_MODIFIED_SINCE'] ) && strtotime( $_SERVER['HTTP_IF_MODIFIED_SINCE'] ) >= $modified_time ) { $protocol = (isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.1'); header( $protocol . ' 304 Not Modified' ); } } } |
Проверка наличия Last-Modified
Для проверки работает ли заголовок Last-Modified я использую сервис https://last-modified.com/ru/ . Если все сделано правильно мы должны получить Last-Modified найден! и 304 Not Modified найден!
Почему может не работать Last-Modified ?
1) На хостинге включен SSI, чтобы все заработало нужно убрать галочку или же выключить его.
2) На хостинге включена оптимизация сайта, ее нужно отключить и снять все галочки. Настроить сжатие через .htaccess ( если оно нужно) .