【问题标题】:Cloudfront serving stale CSS for Rails 3.2 appCloudfront 为 Rails 3.2 应用程序提供陈旧的 CSS
【发布时间】: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


    【解决方案1】:

    当您在 heroku 上部署应用程序时,资产不会自动同步到您的 CDN。在 heroku 上的部署脚本中,它会执行 rake assets:precompile 任务,但不会将它们放入您的 CDN。在部署应用时,您必须创建某种机制自行执行此操作。

    有人问了类似的问题,您可能想看看那里的建议:Rails 3 automatic asset deployment to Amazon CloudFront?

    【讨论】:

      猜你喜欢
      • 2021-12-28
      • 2017-01-29
      • 2020-12-02
      • 2015-12-12
      • 2016-10-11
      • 1970-01-01
      • 2016-05-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多