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";
}
Логика здесь такова:
- Установите cookie на время, когда был сделан первый запрос
- При первом запросе продолжайте как обычно и нажмите таблицу стилей
- При последующих запросах убедитесь, что время, сохраненное в файле cookie, превышает время изменения файла, если файл был изменен с момента первого посещения, очистите файл cookie и активируйте HTTP-запрос, чтобы браузер увидел обновленный CSS.
К сожалению, я не могу понять, как реализовать нечто подобное. Это вообще возможно?