我正在尝试了解Heroku上的HTTP缓存。阅读their article之后,我很好奇Cache-Control HTTP标头是如何工作的。
在文章的sample application mentioned中,标题是在控制器操作中设置的:
def image
@qrimage = QRImage.find_by_md5(params[:md5])
if @qrimage
headers['Cache-Control'] = 'public; max-age=2592000' # cache image for a month
send_data @qrimage.data, :filename => @qrimage.filename, :disposition => 'inline', :type => "image/png"
else
render :nothing => true, :status => 404
end
end
@qrimage.data
的代码如下:
def data
qrcode = RQRCode::QRCode.new(self.message, :size => self.version, :level => self.ecc.to_sym)
qrcode.to_s
end
所以对我来说,看起来每次都在服务器上生成图像。然后由浏览器缓存一个月。所以这里唯一的节省是同一个访问者试图查看相同的图像。
如果不同的访问者尝试查看同一图像,它仍会生成并发送。如果你问我,那并不是那么有用。
我的理解是否正确,或者是否会为每个网站访问者重新生成相同的图片?
答案 0 :(得分:3)
Aspen和Bamboo堆栈上的Heroku应用程序面向Varnish,一个 HTTP加速器。 Varnish将缓存您的应用程序的输出 根据标准HTTP头提供的提示来描述一个 页面的可缓存性。这些标题与浏览器使用的标题相同, 所以正确设置这些标题可以让你的应用程序倍增 在Heroku上的速度:在Varnish层,再次在用户的 浏览器。
如果您不知道,Varnish本质上是一个非常快速的缓存,位于您的应用程序和互联网之间。当标题表示缓存是安全的时,Varnish会这样做,并使用缓存的对象响应其他请求,而不会访问您的应用程序。