Обновил 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

Источник: https://github.com/MikeRogers0/puma-ngrok-tunnel

Если вы хотите отключить эту функцию в вашей среде разработки, вы можете установить

config.hosts = nil в config/environments/development.rb,

Простое решение:

Добавьте эту строку в config/environments/development.rb

      config.hosts << /[a-z0-9]+\.ngrok\.io/

Перезагрузите сервер rails, и он будет работать

Эта статья сработала для меня:

  1. Первый вариант - занести в белый список имена хостов в config/environments/development.rb:

    Rails.application.configure do
      config.hosts << "hostname" # Whitelist one hostname
      config.hosts << /application\.local\Z/ # Whitelist a test domain
    end
    
  2. Второй вариант - очистить весь белый список, который пропускает запросы для всех имен хостов:

    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 могут работать одновременно...

Другие вопросы по тегам