HTTP 2.0 нажмите на NGINX. Повторно нажмите, если файл изменился

У меня есть конфигурация на основе примера здесь:

https://www.nginx.com/blog/nginx-1-13-9-http2-server-push/

Используя код, подобный следующему:

map $http_cookie $resources {
    "~*session=1" "";
    default "</style.css>; as=style; rel=preload, </image1.jpg>; as=image; rel=preload, </image2.jpg>; as=image; rel=preload";
}

Он устанавливает cookie-файл при первом запросе и, если cookie-файл не установлен, он загружает необходимые файлы.

Это прекрасно работает, однако затрудняет обновление кеша CSS.

Без HTTP 2 push можно использовать PHP или другой язык сценариев, чтобы сделать это:

<link rel="stylesheet" href="/style.css?<?=filemtime('./style.css')" />

Браузер увидит style.css?[TIMESTAMP] и кешировать CSS. Если CSS был обновлен, браузер будет вынужден снова загрузить CSS.

Однако с HTTP2 push это не работает. Потому что заголовок говорит браузеру ожидать style.css и браузер запрашивает style.css?[TIMESTAMP]таблица стилей загружается дважды, потому что это разные URL.

Даже если бы был $file_timestamp переменная, я не верю, что было бы возможно сделать это:

map $http_cookie $resources {
    "~*session=1" "";
    default "</style.css?$file_timestamp>; as=style; rel=preload, </image1.jpg>; as=image; rel=preload, </image2.jpg>; as=image; rel=preload";
}

Как NGINX будет искать style.css?TIMESTAMP на диске, а не просто style.css,

Тем не менее, если существует метод получения измененного времени определенного файла, то можно сделать что-то вроде этого:

    if ($cookie_session == "") {
        add_header Set-Cookie "session=$timegmt";
    }

    if ($cookie_session < filemtime(style.css)) {
        add_header Link "</style.css>; as=style; rel=preload;""
        add_header Set-Cookie "session=$timegmt";
    }

Логика здесь такова:

  1. Установите cookie на время, когда был сделан первый запрос
  2. При первом запросе продолжайте как обычно и нажмите таблицу стилей
  3. При последующих запросах убедитесь, что время, сохраненное в файле cookie, превышает время изменения файла, если файл был изменен с момента первого посещения, очистите файл cookie и активируйте HTTP-запрос, чтобы браузер увидел обновленный CSS.

К сожалению, я не могу понять, как реализовать нечто подобное. Это вообще возможно?

0 ответов

Другие вопросы по тегам