66

我需要 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 正在做些什么?

4

12 回答 12

80

Blocked Host 是 Rails 6 的一个新特性。你可以将这个模式添加到你config/environments/development.rb的动态 url 的情况下,不用担心

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

同样对于 ngrok 用户,只需将上面替换c9usersngrok

更新: ngrok 目前-在他们的 URL 中使用,所以这应该是准确的config.hosts << /[a-z0-9-]+\.ngrok\.io/

来源:https ://github.com/MikeRogers0/puma-ngrok-tunnel

于 2019-07-17T06:29:05.890 回答
59

如果您想在您的开发环境中禁用此功能,您可以添加config.hosts.clearconfig/environments/development.rb.

于 2019-05-21T12:35:16.927 回答
13

简单的解决方案

将此行添加到config/environments/development.rb

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

重新启动您的 Rails 服务器,它将工作


更新

如果您过去成功使用过这个正则表达式并且它停止工作,那是因为在过去几个月中,ngrok URL 开始使用-字符。上面的正则表达式有一个额外的字符,必须用来代替旧的(非常相似的正则表达式)。

例如,这行得通

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

这行不通

config.hosts << /[a-z0-9]+\.ngrok\.io/ # subtly different and won't allow dashes

确保您使用的是允许破折号的正则表达式!

于 2020-12-06T10:29:21.203 回答
12

这篇文章对我有用:

  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
    

归功于 Manfred Stienstra 。

于 2019-09-06T09:59:19.903 回答
4

我添加Rails.application.config.hosts << "xxxxxxx-xxxxxxx.c9users.io"config/application.rb修复了我的测试应用程序。然后我对我的真实应用程序做了它,它也有效。问题是,Devise 也抛出了一个错误,显然至少要到 Rails 6 beta 版才能修复。我想我会回到Carrierwave我的图像尺寸需求,直到ActiveStorage更成熟。

于 2020-04-14T22:26:32.483 回答
3

Rails 6,当您想允许主机来自时ngrok v2.3.40,将此配置添加到config/environments/development.rb

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

重启服务器并享受

于 2021-10-05T04:22:34.130 回答
3

要允许来自(或其他服务)的任何子域的请求ngrok.io,最简单的解决方案是在它前面加上.这样的:

# config/environments/development.rb

Rails.application.configure do

  ...

  config.hosts << '.ngrok.io'
end

无需像其他答案中提到的那样对子域使用正则表达式。

PS:不要像其他答案中提到的那样禁用此功能config.hosts.clear,因为这违背了 Rails 的 DNS 重新绑定保护的目的,并且在适当的情况下,外部攻击者可以完全访问您的本地 Rails 应用程序信息(来源) .

于 2021-12-07T03:05:38.673 回答
1

在 Rails 6 Action Pack 中引入了 ActionDispatch::HostAuthorization 并且默认只允许 [IPAddr.new(“0.0.0.0/0”), IPAddr.new(“::/0”), “localhost”]

您可以像这样在文件 config/application.rb 中添加 RegExp、Proc、IPAddr 和 String 的数组或单个字符串

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 轻松配置它(在处理通配符域时很有用)。

于 2019-05-16T07:28:40.810 回答
1

注意:您可以使用配置将您的主机列入白名单,application.config.hosts << 'your_unvalid_host_name'但仍然有错误。在这种情况下,错误消息当前不准确。看到这个问题。您不应使用带下划线的主机名。注意:application.config.hosts.clear在这种情况下工作。

于 2021-06-11T15:01:11.083 回答
1

为了支持 ngrok 子域名和区域中的连字符,您需要将更改config/environments/development.rb更改config.hosts/[a-z0-9.-]+.ngrok.io/

例子:

  config.hosts = (config.hosts rescue []) << /[a-z0-9.-]+.ngrok.io/
于 2021-12-17T09:47:24.993 回答
1

将此行添加到 config/environments/development.rb

config.hosts << /.+\.ngrok\.io:\d+/

我看到的大多数响应都缺少 URL 的端口部分。如果您在特定端口(通常是:3000)中访问此 URL,:\d+则正则表达式的一部分是必需的。

重新启动服务器后它将起作用。

于 2021-12-22T14:54:56.790 回答
0

第一次在其中一个终端运行 ngrok 3000,然后打开新终端并运行 rails s ......然后你现在可以看到 ngrok 和 rails s 都可以同时运行......

于 2021-12-15T06:33:11.023 回答