Ruby on rails 如何在RubyonRails中启用背景图像的缓存?
如何在用户浏览器中(强制)缓存背景图像。 将有效期设为1周或1个月左右将非常好Ruby on rails 如何在RubyonRails中启用背景图像的缓存?,ruby-on-rails,ruby-on-rails-3,image,caching,Ruby On Rails,Ruby On Rails 3,Image,Caching,如何在用户浏览器中(强制)缓存背景图像。 将有效期设为1周或1个月左右将非常好 PS:我有一个页面,显示了基于类别的列表。每个类别都有自己的背景图像,我想缓存这些背景图像。每个图像大约有20-30kb,我有大约20个类别 在我工作的地方,我们用过类似的东西。如果您使用的是rails 3.1的资产管道,rails已经为您添加了必要的缓存控制头。这意味着图像由客户端缓存。Rails还确保文件名在重新部署后发生更改,因此访问者不会看到仍在缓存中的旧图像 另请参见:是一种解决方案,是可以帮助您实现它的创
PS:我有一个页面,显示了基于类别的列表。每个类别都有自己的背景图像,我想缓存这些背景图像。每个图像大约有20-30kb,我有大约20个类别 在我工作的地方,我们用过类似的东西。如果您使用的是rails 3.1的资产管道,rails已经为您添加了必要的缓存控制头。这意味着图像由客户端缓存。Rails还确保文件名在重新部署后发生更改,因此访问者不会看到仍在缓存中的旧图像 另请参见:是一种解决方案,是可以帮助您实现它的创业板 安装 这个gem需要ruby 1.9 基本安装
sudo gem install lacquer
rails generate lacquer:install
config/initializers/clair.rb
Lacquer.configure do |config|
# Globally enable/disable cache
config.enable_cache = true
# Unless overridden in a controller or action, the default will be used
config.default_ttl = 1.week
# Can be :none, :delayed_job, :resque
config.job_backend = :none
# Array of Varnish servers to manage
config.varnish_servers << {
:host => "0.0.0.0", :port => 6082 # if you have authentication enabled, add :secret => "your secret"
}
# Number of retries
config.retries = 5
# config handler (optional, if you use Hoptoad or another error tracking service)
config.command_error_handler = lambda { |s| HoptoadNotifier.notify(s) }
### Varnish - 2.x / 3.x .. VCL-Changes
### https://www.varnish-cache.org/docs/trunk/installation/upgrade.html
# => Purge Command ( "url.purge" for Varnish 2.x .. "ban.url" for Varnish 3.x )
# => purges are now called bans in Varnish 3.x .. purge() and purge_url() are now respectively ban() and ban_url()
config.purge_command = "ban.url"
# => VCL_Fetch Pass Command ( "pass" for Varnish 2.x .. "hit_for_pass" for Varnish 3.x )
# => pass in vcl_fetch renamed to hit_for_pass in Varnish 3.x
config.pass_command = "pass"
end
在清扫车里,我们可以做这样的事情
class_section = ClassSection.find(1)
Lacquer.cache_control.purge(:open_scoring, class_section)
这将清除“^(/[a-z]{2}”)/class_sections/1/open_scoring.*$”(/sv/class_sections/1/open_scoring.js,/sv/class_sections/1/open_scoring.html)
当使用rake任务启动清漆时,varnish.vcl是预涂的
rake lacquer:varnishd:start
rake lacquer:varnishd:start
rake lacquer:varnishd:stop
rake lacquer:varnishd:restart
rake lacquer:varnishd:status
rake lacquer:varnishd:global_purge
config/varnish.vcl.erb
sub vcl_recv {
# Lookup requests that we know should be cached
if (<%= Lacquer.cache_control.to_vcl_conditions %>) {
# Clear cookie and authorization headers, set grace time, lookup in the cache
unset req.http.Cookie;
unset req.http.Authorization;
return(lookup);
}
# Generates
#
# if(req.url ~ "^/images" ||
# req.url ~ "^/stylesheets" ||
# req.url ~ "^/javascripts" ||
# req.url ~ "^(/[a-z]{2})?/(info_screens|class_sections)/[0-9]+.*$" ||
# req.url ~ "^(/[a-z]{2})?/class_sections/[0-9]+/open_scoring.*$") {
# unset req.http.Cookie;
# unset req.http.Authorization;
# return(lookup);
# }
}
sub vcl_fetch {
<%= Lacquer.cache_control.to_vcl_override_ttl_urls %>
# Generates
#
# if(req.url ~ "^/images" || req.url ~ "^/stylesheets" || req.url ~ "^/javascripts") {
# unset beresp.http.Set-Cookie;
# set beresp.ttl = 365d;
# return(deliver);
# }
#
# if(req.url ~ "^(/[a-z]{2})?/(info_screens|class_sections)/[0-9]+.*$" ||
# req.url ~ "^(/[a-z]{2})?/class_sections/[0-9]+/open_scoring.*$") {
# unset beresp.http.Set-Cookie;
# set beresp.ttl = 1m;
# return(deliver);
# }
}
清除缓存:
class Posts < ApplicationController
after_filter :clear_cache, :only => [ :create, :update, :destroy ]
private
def clear_cache
clear_cache_for(
root_path,
posts_path,
post_path(@post))
end
end
戈查斯
大多数操作的默认TTL设置为0,因为在大多数情况下,您可能希望非常明确地知道varnish缓存了哪些页面。默认缓存标头通常为:
缓存控制:最大年龄=0,无缓存,专用
这对于正常的控制器操作很好,因为您不想缓存它们。如果某个操作的TTL设置为0,则它不会与默认标头冲突
这里的关键问题是缓存页面会剥离cookie,因此如果应用程序依赖于会话并使用真实性令牌,则用户需要在表单操作开始工作之前设置会话cookie。在此处将默认TTL设置为0将确保这些会话cookie不会中断
因此,设置可缓存操作所需做的就是上面的before过滤器。您可以按照@Tass的建议使用Varnish,或者让apache或nginx添加如下所述的头:您能帮助我快速安装/工作吗。。一旦我在ubuntu服务器上安装了debian,下一步该怎么办??
sub vcl_recv {
# Lookup requests that we know should be cached
if (<%= Lacquer.cache_control.to_vcl_conditions %>) {
# Clear cookie and authorization headers, set grace time, lookup in the cache
unset req.http.Cookie;
unset req.http.Authorization;
return(lookup);
}
# Generates
#
# if(req.url ~ "^/images" ||
# req.url ~ "^/stylesheets" ||
# req.url ~ "^/javascripts" ||
# req.url ~ "^(/[a-z]{2})?/(info_screens|class_sections)/[0-9]+.*$" ||
# req.url ~ "^(/[a-z]{2})?/class_sections/[0-9]+/open_scoring.*$") {
# unset req.http.Cookie;
# unset req.http.Authorization;
# return(lookup);
# }
}
sub vcl_fetch {
<%= Lacquer.cache_control.to_vcl_override_ttl_urls %>
# Generates
#
# if(req.url ~ "^/images" || req.url ~ "^/stylesheets" || req.url ~ "^/javascripts") {
# unset beresp.http.Set-Cookie;
# set beresp.ttl = 365d;
# return(deliver);
# }
#
# if(req.url ~ "^(/[a-z]{2})?/(info_screens|class_sections)/[0-9]+.*$" ||
# req.url ~ "^(/[a-z]{2})?/class_sections/[0-9]+/open_scoring.*$") {
# unset beresp.http.Set-Cookie;
# set beresp.ttl = 1m;
# return(deliver);
# }
}
before_filter { |controller| controller.set_cache_ttl(15.minutes) }
class Posts < ApplicationController
after_filter :clear_cache, :only => [ :create, :update, :destroy ]
private
def clear_cache
clear_cache_for(
root_path,
posts_path,
post_path(@post))
end
end
rake lacquer:varnishd:start
rake lacquer:varnishd:stop
rake lacquer:varnishd:restart
rake lacquer:varnishd:status
rake lacquer:varnishd:global_purge