Seo блог

Как установить Last-Modified и If-Modified-Since

Большинство веб-мастеров сталкивается с проблемой как же настроить Last-Modified и If-Modified-Since для своего сайта. Для начал хотел бы объяснить что это за заголовки и для чего они нужны.

Содержание:

1 Для чего нужны заголовки Last-Modified
2 Last-Modified для html сайта
3 Last-Modified для Joomla
4 Last-Modified для WordPress
5 Проверка наличия Last-Modified
6 Почему может не работать Last-Modified ?

Для чего нужны заголовки 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) чтобы все заработало.

<?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 для html сайта


Настройка Last-Modified для Joomla

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

Первый код нужно вставить в /templates/Название вашей темы/html/com_content/article/default.php после строчки defined(‘_JEXEC’) or die;

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

Настройка Last-Modified для Joomla

Второй код нужно вставить в /templates/Название вашей темы/html/com_content/category/blog.php после строчки defined(‘_JEXEC’) or die;

$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;
}

Last-Modified для Joomla

Если у вас нету папки com_content тогда:
1) Первый код нужно вставить в /components/com_content/views/article/tmpl/default.php после defined(‘_JEXEC’) or die;

Второй код по Last-Modified для Joomla
2) Второй код нужно вставить в /components/com_content/views/category//tmpl/default.php после defined(‘_JEXEC’) or die;

Второй код по Last-Modified Joomla


Настройка Last-Modified для WordPress

Ниже прилагаю код который заработал на моем сайте и еще нескольких на движке WordPress, его нужно вставить wp-content/themes/Название вашей темы/functions.php в самом верху после открывающимся тегом <?php

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 ) );
    }
 
    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 для WordPress


Проверка наличия Last-Modified

Для проверки работает ли заголовок Last-Modified я использую сервис https://last-modified.com/ru/ . Если все сделано правильно мы должны получить Last-Modified найден! и 304 Not Modified найден!
Проверка наличия Last-Modified

Время загрузки с 200 ответом
код ответа 200

Время загрузки с 301 ответом
код ответа 301


Почему может не работать Last-Modified ?

1) На хостинге включен SSI, чтобы все заработало нужно убрать галочку или же выключить его.

На хостинге включен SSI

2) На хостинге включена оптимизация сайта, ее нужно отключить и снять все галочки. Настроить сжатие через .htaccess ( если оно нужно) .

На хостинге включена оптимизация сайта

[Всего голосов: 8    Средний: 4.4/5]