Обновил Rails до 6, получая ошибку заблокированного хоста
Мне нужна была новая функция в ActiveStorage для resize_to_fill, поэтому я обновился до Ruby 2.5.1 и Rails 6.
ruby '2.5.1'
gem "rails", github: "rails/rails"
Когда я остановился, затем запустил свой сервер (Cloud 9), я получил ошибку Rails:
Заблокированный хост: xxxxxxx-xxxxxxx.c9users.io Чтобы разрешить запросы к xxxxxxx-xxxxxxx.c9users.io, добавьте следующую конфигурацию:
Rails.application.config.hosts << "xxxxxxx-xxxxxxx.c9users.io"
Я пробовал перезапускать новые окна, но от этого ничего не избавилось. Я никогда не видел эту ошибку раньше. Я предполагаю, что новая версия Rails что-то делает?
14 ответов
Как я уже говорил в первоначальном вопросе, использование Active Storage и правильное изменение размера изображений было задачей, которая, по-видимому, вообще не работала с Rails 5.x. После некоторого времени и тонны исследований на imagemagick.org я заставил его работать именно так, как мне было нужно, и теперь я могу сказать, что я использую Active Storage на Rails 5.2 со всем, от файлов до изображений. В этом случае, что касается изображений, я добавил этот код для их отображения.
<%= image_tag attachment.variant(combine_options: {auto_orient: true, thumbnail: '200x200^', gravity: 'center', extent: '200x200' }) %>
Если интересует,
auto-orient
заботится о тех сумасшедших боковых фотографиях, с которыми вы иногда сталкиваетесь.
gravity
а также extent
береги урожай.
Как только изображение загружено в первый раз, оно будет доступно оттуда. Первый раз - загрузка, это может занять дополнительную секунду или две, в зависимости от размера.
Заблокированный хост - это новая функция Rails 6. Вы можете добавить этот шаблон в свой config/environments/development.rb
не беспокоиться об этом в случае динамических URL
config.hosts << /[a-z0-9]+\.c9users\.io/
Также для пользователя ngrok, просто замените выше c9users
по ngrok
Если вы хотите отключить эту функцию в вашей среде разработки, вы можете установить
config.hosts = nil
в config/environments/development.rb
,
Простое решение:
Добавьте эту строку в
config/environments/development.rb
config.hosts << /[a-z0-9]+\.ngrok\.io/
Перезагрузите сервер rails, и он будет работать
Эта статья сработала для меня:
Первый вариант - занести в белый список имена хостов в
config/environments/development.rb
:Rails.application.configure do config.hosts << "hostname" # Whitelist one hostname config.hosts << /application\.local\Z/ # Whitelist a test domain end
Второй вариант - очистить весь белый список, который пропускает запросы для всех имен хостов:
Rails.application.configure do config.hosts.clear end
Кредит принадлежит Манфреду Стиенстре.
Чтобы разрешить запросы с любого поддомена
ngrok.io
(или другой сервис), самое простое решение — добавить перед ним
.
вот так:
# config/environments/development.rb
Rails.application.configure do
...
config.hosts << '.ngrok.io'
end
Нет необходимости использовать регулярное выражение для поддоменов, как указано в некоторых других ответах.
PS: не отключайте эту функцию, выполняя
config.hosts.clear
как упоминалось в некоторых других ответах, поскольку это противоречит цели защиты от повторной привязки DNS Rails, и при правильных обстоятельствах внешний злоумышленник может получить полный доступ к информации о вашем локальном приложении Rails (источник ).
config.hosts = nil
Используйте это в
development.rb
и перезапустите ваш сервер rails, у меня он работает, он будет работать.
В Rails 6 Action Pack представлен ActionDispatch::HostAuthorization и по умолчанию разрешено только [IPAddr.new("0.0.0.0/0"), IPAddr.new("::/0"), "localhost"]
Вы можете добавить массивы RegExp, Proc, IPAddr и String или одну строку в файле config/application.rb следующим образом
class Application < Rails::Application
config.hosts << "xxxxxxx-xxxxxxx.c9users.io"
...
end
Из " https://drivy.engineering/rails-6-unnoticed-features":
В Rails 6 добавлено новое промежуточное ПО под названием ActionDispatch::HostAuthorization, позволяющее вам вносить в белый список некоторые хосты для вашего приложения и предотвращающее атаки заголовков хостов. Вы можете легко настроить его с помощью String, IPAddr, Proc и RegExp (полезно при работе с подстановочными доменами).
Как я сказал выше в своем комментарии, вот что я сделал. Перепубликовано из-за голосов против.
Я добавил Rails.application.config.hosts << "xxxxxxx-xxxxxxx.c9users.io" в config/application.rb, и это исправило мое тестовое приложение. Затем я проделал это с моим настоящим приложением, и оно тоже сработало. Проблема в том, что Devise также выдал ошибку, которая, очевидно, не будет исправлена, по крайней мере, до бета-версии Rails 6. Думаю, я возвращаюсь в Carrierwave для решения своих задач по изменению размера изображения, пока ActiveStorage не станет более зрелым.
В
Rails 6
, когда вы хотите разрешить хосту от
ngrok v2.3.40
, добавьте этот конфиг в
config/environments/development.rb
config.hosts << /[a-z0-9\-]+\.ap\.ngrok\.io/
Перезагрузите сервер и наслаждайтесь
Добавьте эту строку в config/environments/development.rb
config.hosts << /.+\.ngrok\.io:\d+/
В большинстве ответов, которые я вижу, отсутствует часть порта URL-адреса. Если вы обращаетесь к этому URL через определенный порт (обычно
:3000
)
:\d+
часть регулярного выражения необходима.
Он будет работать после перезапуска вашего сервера.
Для поддержки дефисов в имени и регионе субдомена ngrok вам необходимо изменить
config/environments/development.rb
сдача
config.hosts
к
/[a-z0-9.-]+.ngrok.io/
Пример:
config.hosts = (config.hosts rescue []) << /[a-z0-9.-]+.ngrok.io/
В ГОЛОВУ: вы можете внести свой хост в белый список с конфигурацией
application.config.hosts << 'your_unvalid_host_name'
но все еще есть ошибка. В этом случае сообщение об ошибке в настоящее время неверно. См. Эту проблему . Вы не должны использовать имя хоста с подчеркиванием. NB:
application.config.hosts.clear
работает в этом случае.
Сначала запустите ngrok 3000 в одном из терминалов, а затем откройте новый терминал и запустите rails... тогда вы увидите, что теперь ngrok и rails могут работать одновременно...