所以Rails时间戳很棒。我正在使用它将expires标头添加到以10位数时间戳结尾的所有文件。然而,我的大多数图像都在我的CSS中引用。有没有人遇到任何允许将时间戳添加到CSS引用图像的方法,或者实现此目的的一些时髦的重写规则?我喜欢我的网站中的所有图片,无论是内联还是css都有这个时间戳,所以我可以告诉浏览器缓存它们,但只要文件本身发生变化就刷新。
我无法在网上找到任何关于此的内容,我无法相信这不是一个更常讨论的主题。
我认为我的设置无关紧要,因为实际的到期时间希望以相同的方式发生,基于10位数的时间戳,但我正在使用apache来提供所有静态内容事项
答案 0 :(得分:5)
我一直在使用asset packager,最后我编辑了插件的compress_css
方法来解决这个问题。我基本上只是css中图像的正则表达式,并插入当前时间戳:
timestamp = Time.now.to_s.gsub(/\D/, '')
source.gsub!(/url\((['"])(.+)(['"])\)/) do
open, file, close = $1, $2, $3
if file =~ /.\.(ico|css|js|gif|jpe?g|png)/
"url(#{open}#{file}?#{timestamp}#{close})"
else
"url(#{open}#{file}#{close})"
end
end
这样,每当我部署时,压缩的css图像都包含附加的时间戳。这种方法的缺点是每个图像都没有自己的时间戳,因此每次部署新的css时,所有的css图像都会“过期”。除非经常部署css,否则总比没有好。
答案 1 :(得分:4)
您可以通过获取文件修改时间来附加每个图像文件的实际时间戳:
source.gsub!(/url\((['"]*)(.+)(['"]*)\)/) do
open, file, close = $1, $2, $3
css_dir = File.join(RAILS_ROOT,"public/stylesheets")
timestamp = ''
FileUtils.cd(css_dir) do
if file =~ /^\// # absolute path
f = File.new(RAILS_ROOT + "/public" + file)
else # relative path
f = File.new(file)
end
timestamp = f.mtime.to_i.to_s
end
if file =~ /.\.(ico|css|js|gif|jpe?g|png)/
"url(#{open}#{file}?#{timestamp}#{close})"
else
"url(#{open}#{file}#{close})"
end
end
(可能有一种更优雅的方式来写这个,我的红宝石剁仍然很弱!) 现在黑客变得丑陋了,但是......你会认为会有更多类似Rails的方式来做这件事。
答案 2 :(得分:3)
最佳解决方案似乎是使用ERB生成样式表,以便您可以使用Rails image_帮助程序而不是直接图像路径。意思是,摆脱你的public / stylesheets / application.css文件并创建app / views / stylesheets / application.css.erb。您还必须创建一个控制器并启用缓存,并设置路由。
以下是完整的详细信息: http://deaddeadgood.com/2009/9/28/far-future-expires-headers-for-css-images-in-rails
答案 3 :(得分:3)
如果有人发现这一点,Jammit现在支持开箱即用。我一直在使用jammit参与一个新项目,我印象非常深刻!