Привет всем. Пытаюсь настроить заголовки Last-Modified, Expires, чтобы с сервера загружались только измененные файлы. Допустим, поправил какой нибудь js-файл, обновил страницу и измененный файл загрузился с сервера, а другие не измененные файлы вернули статус 304 Not Modified.
Без https достаточно просто указать
expires modified 0;
и все работает как надо. Но когда запрос идет через https, то заголовки видимо теряются, так как https соединение идет через proxy DNS. (https бесплатный)
В настройках Cloudflare в разделе
Caching установил
Browser Cache Expiration в положение
Respect Existing Headers (это вроде для использования заголовков с оригинального сервера)
Затем пробовал указать заголовки, игнорируя заголовки фреймворка (Laravel)
location ~* \.(css|js|gif|jpe?g|png)(\?[0-9]+)?$ {
sub_filter_last_modified on;
fastcgi_ignore_headers "Cache-Control" "Expires";
proxy_ignore_headers "Cache-Control" "Expires";
add_header Cache-Control "public, max-age=60, s-maxage=60, must-revalidate, proxy-revalidate";
add_header Last-Modified $sent_http_Expires;
proxy_set_header Last-Modified $sent_http_Expires;
fastcgi_pass_header Last-Modified;
if_modified_since exact;
}
Много всего перепробовал, но заголовки не передаются. Возможно кто то сталкивался с этим, подскажите совет или куда гуглить.
Спасибо.
UPDATE:
удалось найти решение
перед применением надо в разделе
Caching установить
Browser Cache Expiration в положение
2 hours (или еще меньшее значение, на бесплатном плане это 2 часа)
location ~* \.(ico|css|js|gif|jpe?g|png)(\?[0-9]+)?$ {
log_not_found off;
sub_filter_last_modified on;
fastcgi_ignore_headers "Cache-Control";
add_header Cache-Control "public, max-age=30, s-maxage=30, must-revalidate, proxy-revalidate";
proxy_set_header Last-Modified $sent_http_Expires;
proxy_set_header Expires $sent_http_Expires;
fastcgi_pass_header Last-Modified;
fastcgi_pass_header Expires;
if_modified_since exact;
}
работает хорошо, но есть два нюанса
1. Изменения вступят в силу только через 30 секунд после изменения файла
2. В хроме надо будет в консоли установить галочку Disable Cache (для разработчиков)
пока не смог найти причину почему хром не отправляет заголовок If-Modified-Since, ведь он видит заголовок Last-Modified а следовательно, должен добавлять заголовок If-Modified-Since, сейчас ищу решение чтобы это пофиксить (например в фаерфоксе все идеально на счет этого)