5

背景

我目前正在开发一个 Rails 3 项目,我打算将其与 Amazon CloudFront 一起使用,其自定义源指向我的实际 Web 服务器。这意味着我的 Web 服务器将告诉浏览器从 CloudFront 检索静态资产,如果 CloudFront 缓存了资产,它将返回它,如果没有,它将使用我的 Web 服务器的相同路径检索它,然后将其缓存以备将来使用要求。

问题

Amazon CloudFront 在确定是否应该破坏自己的缓存以从其来源重新下载资产时,会丢弃并忽略查询字符串参数。RAILS_ASSET_ID这显然给 Rails 使用which is to do:生成 URL 的方式带来了问题/assets/path/to/asset.ext?RAILS_ASSET_ID。使用默认资产 URL,CloudFront 将保留陈旧资产长达 24 小时。

解决方案?

我希望做的是以某种方式覆盖 Rails 3 生成资产标签的方式,以便我可以生成像/assets/RAILS_ASSET_ID/path/to/asset.ext. 我已经有了如何让 Web 服务器响应这些 URL 的解决方案,我只需要弄清楚如何让 Rails 生成 URL。

笔记

  1. 我的RAILS_ASSET_ID将是我最新的 git 提交哈希的子字符串。设置这将由 capistrano 在部署过程中处理。我可以在每次部署中破坏所有资产缓存,我不需要特定于资产的 ID
  2. 我已经尝试过覆盖ActionView::Helpers::AssetTagHelper.rewrite_asset_path,但它似乎不起作用,从我读到的内容来看,这是一个不应依赖的私有方法。
  3. 先感谢您!
4

2 回答 2

4

“设置ActionController::Base.config.asset_path为采用未修改的资产路径并返回资产缓存工作所需的路径的过程。”

这来自AssetTagHelper文档。

于 2010-12-22T17:17:28.520 回答
1

asset_id插件应该可以解决您的问题。它支持 Amazon S3 和 CloudFront。

于 2010-12-22T16:01:36.013 回答