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) кэшируются.