[英]Rails 4 App image assets pointing to wrong CloudFront domain name
我在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。
但是,當我進行暫存時,生成的圖像將丟失並指向Production 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。)
我終於解決了我的問題。即使我的登台應用程序使用的是正確的asset_host,並且文件是通過正確的CDN提供的,但這些文件中的網址仍指向錯誤的CDN(生產CDN)。這是因為在預編譯資產時,未設置PUSH_TO env變量,因此production.rb中的邏輯使用生產CDN。 解決方法是:
rake RAILS_ENV=production PUSH_TO=staging assets:clean assets:precompile
關鍵是在那里的PUSH_TO = staging。 這解決了我所有的問題!
顯然,您在此行的條件返回false:
config.action_controller.asset_host = 'yyyy.cloudfront.net' if ENV['PUSH_TO'] && ENV['PUSH_TO'].downcase == 'staging'
否則,或者asset_host將不允許設置兩次。 不知道為什么會這樣。 最好將其放在else塊中。
因此,請解決此問題,然后您將被設置。
但....
這不是什么環境文件嗎? 為什么您的環境/staging.rb文件中沒有這個? 如果它在那里不起作用,則說明您已經破壞了環境配置,還打敗了多個環境的整個目標……
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.