erniesto77
@erniesto77
oop, rb, py, php, js

Как настроить заголовки Last-Modified через бесплатный ssl на Clouflare?

Привет всем. Пытаюсь настроить заголовки 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, сейчас ищу решение чтобы это пофиксить (например в фаерфоксе все идеально на счет этого)
  • Вопрос задан
  • 1324 просмотра
Пригласить эксперта
Ответы на вопрос 1
@BorisKorobkov
Web developer
С вашего сервера заголовки уходят не зависимо от http/https.

Если запрос идет через Cloudflare, то он иногда может отдавать данные из своего кэша. В случае изменения статичного файла (который раньше разрешили кэшировать) - надо либо "Purge cache" в Cloudflare, либо отредактированный файл сохранять под другим именем (или хотя бы обращаться к нему с другим GET-параметром)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы