【发布时间】:2014-08-21 10:40:06
【问题描述】:
我正在 Heroku 上运行 Rails 4 应用程序,使用 CloudFront 作为某些图像资产的 CDN。我有一个 Production 应用程序和一个 Staging 应用程序。在 CloudFront 上,我有单独的生产和暂存分配。我正在本地预编译资产并将它们推送到 Heroku。
我的 production.rb 有以下内容:
# production.rb
config.action_controller.asset_host = 'xxxx.cloudfront.net'
# Use special staging CDN if pushing to staging
config.action_controller.asset_host = 'yyyy.cloudfront.net' if ENV['PUSH_TO'] && ENV['PUSH_TO'].downcase == 'staging'
所以我指定了不同的asset_host,具体取决于我是推动暂存还是生产。
但是,当我推送到暂存时,生成的图像丢失并指向生产 CloudFront 分配。
我在应用程序中放置了一些日志记录语句,以确保 config.action_controller.asset_host 设置为正确的暂存分布。
如果我通过将主机从生产主机更改为临时主机来手动访问图像 url,它们可以工作,所以我知道指纹已正确更新。
我的 .css.scss.erb 文件包含:
.importance1 { background-image: image-url("<%= asset_path 'myImage1.png' %>"); }
我确保清除了我的 public/assets 和 tmp 文件夹。
那么,什么可能导致我在 Staging 上的资产指向错误的 CloudFront 分配?
更新:我发现只有从其他资产(css 文件)中使用 asset_path 引用的资产才会获得错误的 CDN 主机。同时,使用image_tag 从视图中显示的资产工作正常。这让我认为问题出在预编译资产期间,错误的 url 从 css 文件中的 asset_path 获取输出。不知道为什么。我打电话给rake RAILS_ENV=production assets:clean assets:precompile,就像我说的那样,我尝试修改 production.rb 以明确使用暂存 CDN 作为测试,但它仍然没有使用它(资产仍然指向生产 CDN。)
【问题讨论】:
-
作为健全性检查,您是否尝试过使用 if/else?
-
我进一步进行了健全性检查,并仅将设置替换为
config.action_controller.asset_host = 'yyyy.cloudfront.net',但我的图像仍然指向“xxxx.cloudfront.net”。
标签: ruby-on-rails heroku amazon-cloudfront