2008-10-08 7 views
9

Когда я развертываю приложение rails в режиме производства, он добавляет строку даты в качестве параметра запроса в конец всех URL-адресов статического актива. Это делается для того, чтобы браузеры не использовали старые устаревшие копии активов после повторного развертывания приложения.Удаление сбоя кэша в Rails-производстве

Есть ли способ сделать рельсы использовать старые штампы времени для активов, которые не изменились (и только те, которые не изменились) с момента последнего развертывания. Я хочу сделать это, чтобы пользователи не могли повторно загрузить те активы, которые не изменились.

+2

Обратите внимание, что с рельсов 3.1 Rails использует MD5, а не Timestamps, что означает, что этот вопрос больше не является relavent. – 2011-07-26 17:09:52

ответ

6

Я думаю, вы можете использовать ENV ['RAILS_ASSET_ID'], чтобы изменить идентификатор актива, связанного с кэшем. К сожалению, это для всех активов.

Но если он не установлен, он использует время модификации источника актива. Если этот файл не был изменен с момента последнего использования вами, это не должно быть проблемой.

Если идентификатор объекта изменяется, когда он не был изменен, это может быть из-за вашего процесса развертывания, изменяющего время модификации, и, возможно, вы можете посмотреть на его настройку.

Наконец, вы всегда можете найти override rails_asset_id with your own custom method.

Надеюсь, это поможет.

0

@Aupajo Мне это нравится, но я думаю, что смогу это сделать немного дальше. Проблема здесь в том, что capistrano создает новые копии всех файлов при каждом развертывании, поэтому все строки, связанные с кэшем, изменяются. Однако MD5 файла изменится только при изменении содержимого файла.

Конечно, генерируя MD5 дорого и медленно, но вы можете кэшировать MD5 файл в кэше, (шпонка на время изменения, как будто время изменилось MD5 могут изменились, но если метка время не изменило MD5 не изменили

13

Capistrano по умолчанию затрагивает все файлы, которые он считает в «актив». Как вы сказали, это означает, что после каждого развертывание рельсам думает каждый актив изменился и браузеры Виля Загрузите более новую версию каждый раз.

Вы можете отключить это в Capistrano со следующей настройкой

set :normalize_asset_timestamps, false 

Если вы используете SVN, то измененные даты для файлов должны отражать даты последнего изменения в вашем хранилище, так что должно быть совершенным.

Если вы используете Apache, вы можете добавить что-то подобное, чтобы действительно сделать работу кеширования для вас. Это помогает, говоря браузеру о том, чтобы полагаться на директивы «Cache Control», означающие, что если он знает, что актив кэширован, он даже не потрудится запросить его.

#Etags should be based on the file parameters only (default includes INode) 
FileETag MTime Size 

#Rewrite stuff 
RewriteEngine On 

#This sets the environment variable (is_versioned) when the URL query string 
#looks like ?874353948543 or any string of digits 
RewriteCond %{QUERY_STRING} ^[0-9]+$ 
RewriteRule ^(.*)$ $1 [env=is_versioned:true] 

<Directory /deployed-rails-app/public/ > 
    Options -Indexes FollowSymLinks -MultiViews 
    AllowOverride None 
    Order allow,deny 
    allow from all 

    #For files, force the browser to rely on cache-control directives and 
    #Rails asset timestamps by removing Etags and Last-Modified dates 

    #For all assets that aren't stamped by rails, cache them for ~ 3 hours 
    Header set "Cache-Control" "max-age=10000" 
    Header unset Etag 
    Header unset "Last-Modified" 

    #For all assets that ARE stamped by rails, cache them for 30 days 
    Header set "Cache-Control" "max-age=2592000" env=is_versioned 

</Directory> 

Я установил мой рабочий сервер этот путь и теперь возвращают посетителей выполнить только один запрос (Get /), который возвращает динамический контент и все активы (~ 40 - 50) кэшируются.

+0

святой гуакамоле, два года назад? почему никто не уклонился от этого решения. Помимо накладных расходов на запуск (простого) регулярного выражения по URL каждого запроса, мне это нравится. – sbeam 2010-11-25 04:59:01

 Смежные вопросы

  • Нет связанных вопросов^_^