【问题标题】:Rails 4 App image assets pointing to wrong CloudFront domain nameRails 4 App图像资产指向错误的CloudFront域名
【发布时间】: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/assetstmp 文件夹。

那么,什么可能导致我在 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


【解决方案1】:

我终于找到了我的问题。即使我的登台应用程序使用了正确的资产主机,并且文件是从正确的 CDN 提供的,这些文件中的 url 指向错误的 CDN(生产 CDN。)这是因为在预编译资产时,未设置 PUSH_TO 环境变量,因此我的 production.rb 中的逻辑使用的是生产 CDN。解决方案是:

rake RAILS_ENV=production PUSH_TO=staging assets:clean assets:precompile

关键是那里的 PUSH_TO=staging。这解决了我所有的问题!

【讨论】:

    【解决方案2】:

    很明显,您在这一行的条件返回 false:

    config.action_controller.asset_host = 'yyyy.cloudfront.net' if ENV['PUSH_TO'] && ENV['PUSH_TO'].downcase == 'staging'
    

    无论是那个还是asset_host都不允许被设置两次。不知道为什么会这样。将其放在 else 块中可能会更好。

    所以修复它,你就会被设置。

    但是....

    这不是环境文件的用途吗?为什么你的环境/staging.rb 文件中没有这个?如果它在那里不起作用,那么您已经修改了您的环境配置并且有点破坏了多个环境的全部目的......

    【讨论】:

    • 就像我说的,我将日志语句放入以检查config.action_controller.asset_host 的值,并且它已正确设置为登台主机。我连接到 Rails 控制台并检查了值。我什至完全替换了那些配置设置并离开了config.action_controller.asset_host = 'yyyy.cloudfront.net',但图像仍然指向xxxx.cloudfront.net
    猜你喜欢
    • 2014-07-24
    • 2014-04-20
    • 2015-06-20
    • 2015-05-16
    • 2017-07-29
    • 2014-08-04
    • 2016-01-05
    • 1970-01-01
    • 2016-05-22
    相关资源
    最近更新 更多