在Rails中使用helper链接应用中的JavaScript和CSS文件的时候,会在文件的路径后面添加一个问号和一个数字,如: <link href=”/stylesheets/application.css?1200155369″ media=”all” rel=”stylesheet” type=”text/css” /> 问号后面的数字被称为asset id,目的是为了一些容易被缓存的目标如JavaScript和CSS文件,在文件被更改后不会被浏览器或代理服务器强制使用缓存,这也用于某些Ajax请求中。 但是这种asset id的行为比较怪异,他是一个查询字符串,但是没有键值对。我的一个部署方式是在一个已经架设了WordPress的域名下,使用反向代理向用户暴露某个控制器。因为给WordPress配置了mod_rewrite,并启用了.htaccess,将所有不存在的文件重写到wordpress的脚本处理。而这时我使用了Alias来将Rails的public目录下的javascripts和stylesheets目录绑定到相应的URL路径下,Apache却在处理这个asset id上有些问题,直接访问/javascripts/prototype.js可以得到,但/javascripts/prototype.js?11223344却会跑到WordPress中,并且说这个文件不存在。这可能和Apache处理URL的次序有关。当然,将DocumentRoot配置到Rails的Public目录,则不会出现这个问题。 无论如何,我要去掉这个asset id,根据Rails 2.0的代码,大家可以在actionpack/lib/action_view/helpers/asset_tag_helper.rb中找到生成asset id的方法rails_asset_id,如下: # Use the RAILS_ASSET_ID environment variable or the source’s # modification time as its cache-busting asset id. def rails_asset_id(source) if asset_id = ENV["RAILS_ASSET_ID"] asset_id else path = File.join(ASSETS_DIR, source) if File.exist?(path) File.mtime(path).to_i.to_s else ” end end end 代码的注释也说的很清楚了,asset id默认为文件的修改时间的时间戳,也可以通过环境变量RAILS_ASSET_ID来自行设置。环境变量可以在系统中设定,也可以在environment.rb或相应的环境配置的代码中修改,比如我在config/environments/production.rb中添加了: [...]
关于我
- 曹力
- 程序员 / 架构师
- JavaScript高级程序设计译者
- NirvanaStudio精神领袖
版权声明
本 Blog 所有文章若无特别声明都遵循创作共用约定,要求署名、非商业、保持一致。转载时请先阅读以上许可协议,并以超链接形式注明出处。分类目录
-
RSS Links
Blogroll
Nirvana Studio
其他
标签
功能
-
