Ресурсы изображения приложения Rails 4, указывающие на неправильное доменное имя CloudFront

#ruby-on-rails #heroku #amazon-cloudfront

#ruby-on-rails #heroku #amazon-cloudfront

Вопрос:

Я запускаю приложение Rails 4 на Heroku, используя CloudFront в качестве CDN для некоторых ресурсов изображения. У меня есть производственное приложение и промежуточное приложение. В 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'] amp;amp; 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 папки.

Итак, что может быть причиной того, что мои ресурсы при постановке указывают на неправильный дистрибутив CloudFront?

Обновление: я обнаружил, что только ресурсы, на которые ссылаются asset_path из других ресурсов (файлов css), получают неправильный хост CDN. Между тем, ресурсы, которые отображаются из представлений с использованием image_tag , работают нормально. Это заставляет меня думать, что проблема заключается в том, что во время предварительной компиляции ресурсов из asset_path файлов CSS выводятся неправильные URL-адреса. Не уверен, почему. Я звоню rake RAILS_ENV=production assets:clean assets:precompile и, как я уже сказал, я попытался изменить production.rb, чтобы явно использовать промежуточный CDN только в качестве теста, и он все еще не использовал его (ресурсы по-прежнему указывают на производственный CDN.)

Комментарии:

1. Просто для проверки работоспособности, вы пробовали использовать if / else?

2. Я еще больше проверил работоспособность и заменил настройки на просто config.action_controller.asset_host = 'yyyy.cloudfront.net' , и все еще мои изображения указывают на ‘xxxx.cloudfront.net ‘.

Ответ №1:

Я, наконец, разобрался со своей проблемой.. Несмотря на то, что мое промежуточное приложение использовало правильный asset_host, а файлы обслуживались с правильного CDN, URL-адреса в этих файлах указывали на неправильный CDN (производственный CDN.). Это было связано с тем, что при предварительной компиляции ресурсов переменная PUSH_TO env не была установлена, поэтому логика в моем 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'] amp;amp; ENV['PUSH_TO'].downcase == 'staging'
  

Либо это, либо asset_host не позволит устанавливать дважды. Не знаю, почему это было бы. Возможно, было бы лучше поместить это в блок else.

Так что исправьте это, и все будет готово.

НО….

Не для этого ли предназначены файлы среды? Почему у вас нет этого в вашем файле environments / staging.rb? Если это не работает там, вы изменили конфигурацию своей среды и как бы нарушили всю цель нескольких сред…

Комментарии:

1. Как я уже сказал, я ввел операторы регистрации, чтобы проверить значение config.action_controller.asset_host , и оно правильно установлено для промежуточного хоста. Я подключился к консоли rails и также проверил значение. Я даже полностью заменил эти настройки конфигурации и просто ушел config.action_controller.asset_host = 'yyyy.cloudfront.net' , и все еще изображения указывали на xxxx.cloudfront.net .