【发布时间】:2014-06-29 08:40:37
【问题描述】:
我正在 Heroku 上运行 Rails 3.2 应用程序。在大约一周的时间里,我们通过在 config/production.rb 文件中将 config.action_controller.asset_host 设置为 CloudFront URL 来通过 CloudFront 提供资产。这很成功。
然而,上周末,我注意到在部署到生产环境后,我们的网站看起来很糟糕,原因是它提供了陈旧的 CSS。我查看了它提供的 css 文件(使用 Chrome 中的检查元素),CSS 是来自 CloudFront 的 md5 散列的 application.css 文件。我删除了asset_host 行(以便直接从我们的应用程序提供资产)并再次部署(不更改任何css),并注意到现在看起来很好的站点正在使用不同的md5 散列提供application.css。
看来,出于某种原因,CloudFront 提供的是旧版本的 application.css,我猜这是因为我们的应用程序告诉用户的浏览器提供旧版本的 application.css。
再添加一个变量:我们确实缓存了主页和部分 layouts/application.html.erb 文件(其中包含样式表标签),但在每次部署时,我们都会通过 Rails.cache.clear 清除缓存.
所以我最好的猜测是 Rails.cache.clear 可能没有正确地使缓存无效。如果有帮助,我们会使用 dalli memcache 客户端。
任何见解或建议将不胜感激!
更新:
我尝试将 CSS 从缓存块中移出并重新启用 CloudFront,但 CSS 似乎仍然损坏。所以它似乎与缓存标头无关。
更新 2:
看起来这是 CloudFront 问题,因为当我检查元素并将 CSS URL 更改为我们的根域(而不是 CDN 域)时,CSS 会正确呈现。
由于 md5 哈希冲突的可能性极小,当我请求正确的 md5 指纹 CSS 文件时,CloudFront 似乎提供了错误的 CSS 文件。有什么想法吗?
【问题讨论】:
标签: css ruby-on-rails caching asset-pipeline amazon-cloudfront