Уроки

ETag заголовок для работы кеширования

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

Есть 3 механизма кеширования:

  • Заголовки «cache-control» или «expires» сообщают о том, сколько времени контент будет актуальным. В течение этого времени браузер пользователя используют сохранённую у себя копию файла и не делает никаких запросов на сервер.
  • Кеширование через «etag». Сервер генерирует уникальную строку на основе содержимого файла, и браузер пользователя каждый раз переспрашивает, а не изменился ли файл и предоставляет эту строку.
  • Заголовок «Last-Modified». Сервер сообщает дату последнего изменения файла, а браузер каждый раз переспрашивает, не изменился ли файл с того времени.

Если сервер не предоставляет строку «etag», то браузер пользователя не сможет закешировать файл.

Инструкция Как настроить кеширование.

Демонстрация скорости работы между работающим кешированием и отключённым:

<?php
if(isset($_GET['img'])) {
    header('Content-Type: image/jpeg');
    echo file_get_contents('photo.jpg');
    die;
}
?><!DOCTYPE html>
<html>
    <head>
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <style>
            .example {
                display: flex;
            }
            .img {
                position: relative;
            }
            img {
                width: 250px;
            }
            .time {
                position: absolute;
                left: 5px;
                top: 5px;
                background-color: #fff;
                padding: 1px 4px;
            }
            .btn {
                color: #000;
                text-decoration: none;
                padding: 5px 10px;
                border: 1px solid #000;
                border-radius: 5px;
            }
            .btn:hover {
                background-color: #ddd;
            }
            .btn.active {
                background-color: #000;
                color: #fff;
            }
        </style>
        <script>
            // Функция, которая добавляет на изображение время окончания загрузки
            function endLoading(el) {
                var time = performance.now()/1000;
                el.parentNode.insertAdjacentHTML("beforeend", '<div class="time">'+time+' с</div>');
            }
        </script>
    </head>
    <body style="font-family: sans-serif;">
        <a class="btn" href="./no_ETag_header.php">Обновить страницу</a><br /><br />
        <div class="example">
            <div class="element">
                Кеширование отключено<br />
                <div class="img">
                    <img src="./no_ETag_header.php?img=1" onload="endLoading(this)" />
                </div>
            </div>
            <div class="element">
                Кеширование работает<br />
                <div class="img">
                    <img src="./photo.jpg" onload="endLoading(this)" />
                </div>
            </div>
        </div>
    </body>
</html>
<!DOCTYPE html>
<html>
    <head>
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <style>
            .example {
                display: flex;
            }
            .img {
                position: relative;
            }
            img {
                width: 250px;
            }
            .time {
                position: absolute;
                left: 5px;
                top: 5px;
                background-color: #fff;
                padding: 1px 4px;
            }
            .btn {
                color: #000;
                text-decoration: none;
                padding: 5px 10px;
                border: 1px solid #000;
                border-radius: 5px;
            }
            .btn:hover {
                background-color: #ddd;
            }
            .btn.active {
                background-color: #000;
                color: #fff;
            }
        </style>
        <script>
            // Функция, которая добавляет на изображение время окончания загрузки
            function endLoading(el) {
                var time = performance.now()/1000;
                el.parentNode.insertAdjacentHTML("beforeend", '<div class="time">'+time+' с</div>');
            }
        </script>
    </head>
    <body style="font-family: sans-serif;">
        <a class="btn" href="./no_ETag_header.php">Обновить страницу</a><br /><br />
        <div class="example">
            <div class="element">
                Кеширование отключено<br />
                <div class="img">
                    <img src="./no_ETag_header.php?img=1" onload="endLoading(this)" />
                </div>
            </div>
            <div class="element">
                Кеширование работает<br />
                <div class="img">
                    <img src="./photo.jpg" onload="endLoading(this)" />
                </div>
            </div>
        </div>
    </body>
</html>

ПРО подписка для работы с сервисом

Промо
Для подготовки коммерческого предложения.
190 ₽
50 страниц на 10 дней
  • 1 страница даёт 1 запуск инструмента Проверка страницы.
  • Покупается для определённого сайта
  • Ограничения на остальные инструменты остаются теми же
ПРО подписка
Для регулярной работы над сайтом или группой сайтов.
1 580 ₽
3500 страниц в неделю. Срок подписки — 1 месяц.
Кошелёк
Отдельный баланс страниц, дополняющий баланс ПРО подписки.
190 ₽
Количество страниц
  • Требуется активная ПРО подписка для использования баланса кошелька
Мы используем cookie. Продолжая пользоваться сайтом, вы соглашаетесь на обработку персональных данных в соответствии с политикой конфиденциальности. Соглашаюсь