Pull to refresh

Кеширование статики через expires и asset timestamps

Reading time 1 min
Views 1.5K
Для ускорения загрузки страницы можно выставлять у статичных компонентов заголовок expires далеко в будущее.
Однако есть одна проблема: вам придётся менять название файла или путь к нему, чтобы пользователь узнал, что файл нужно перечитать.

В Rails есть полезная возможность assets timestamps, если честно, раньше не понимал зачем это нужно.

Разберёмся?

Чтобы не повторяться, дам сылку на статью с детальным описанием логики: Configure the Expires header for Rails under nginx

Общий смысл следующий:
  • если мы всю статику вставляем в шаблоны через rails helpers, то Rails в production добавит к ним так называемые assets timestamps. Грубо говоря это:
    File.mtime(path).to_i.to_s # rails_asset_id
  • тогда, когда файл изменится, то изменится и путь к нему, соответственно и клиентский браузер отправит запрос заново
  • необходимо сделать так чтобы web server устанавливал всем статичным файлам, у которых есть assets timestamps заголовок Expires c далеко в будущем времени:
    • nginx, ngx_http_headers_module
      if ($request_uri ~* "\.(ico|css|js|gif|jpe?g|png)\?[0-9]+$") {
          expires max;
          break;
      }
      

    • httpd, mod_expires
      ExpiresDefault "access plus 1 year"
      

  • Остается только при помощи YSlow проверить, что наша конфигурация работает


UPD: Пример в реальном конфиге gist.github.com/14614
Tags:
Hubs:
+5
Comments 3
Comments Comments 3

Articles