已将 Rails 升级到 6,出现 Blocked host Error
Upgraded Rails to 6, getting Blocked host Error
我需要 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"
我试过重新启动,新 windows,但没有任何办法可以解决这个问题。我以前从未见过这个错误。我猜 Rails 的新版本正在做些什么?
在 Rails 6 Action Pack 中引入了 ActionDispatch::HostAuthorization 并且默认情况下仅允许 [IPAddr.new(“0.0.0.0/0”), IPAddr.new(“:: /0”),“本地主机”]
您可以像这样在文件 config/application.rb 中添加 RegExp、Proc、IPAddr 和字符串数组或单个字符串
class Application < Rails::Application
config.hosts << "xxxxxxx-xxxxxxx.c9users.io"
...
end
来自“https://drivy.engineering/rails-6-unnoticed-features”:
Rails 6 added a new middleware called
ActionDispatch::HostAuthorization allowing you to whitelist some hosts
for your application and preventing Host header attacks. You can
easily configure it with a String, IPAddr, Proc and RegExp (useful
when dealing with wildcard domains).
如果您想在您的开发环境中禁用此功能,您可以将 config.hosts.clear
添加到 config/environments/development.rb
。
Blocked Host 是 Rails 6 的新功能。您可以将此模式添加到您的 config/environments/development.rb
中,这样在使用动态 URL 时就不用担心了
config.hosts << /[a-z0-9]+\.c9users\.io/
同样对于 ngrok 用户,只需将上面的 c9users
替换为 ngrok
更新: ngrok 目前在他们的 URL 中使用 -
所以这应该是准确的 config.hosts << /[a-z0-9-]+\.ngrok\.io/
这个 article 对我有用:
第一个选项是将 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
归功于 Manfred Stienstra。
我将 Rails.application.config.hosts << "xxxxxxx-xxxxxxx.c9users.io"
添加到 config/application.rb
,它修复了我的测试应用程序。然后我对我的真实应用程序做了它并且它也有效。问题是,Devise 也抛出了一个错误,显然至少要到 Rails 6 beta 才能修复。我想我会回到 Carrierwave
以满足我的图像大小需求,直到 ActiveStorage
更加成熟。
简单solution:
将此行添加到 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
确保您使用的正则表达式允许破折号!
注意:您可以使用配置 application.config.hosts << 'your_unvalid_host_name'
将您的主机列入白名单,但仍然有错误。
在这种情况下,错误消息目前并不准确。看到这个 issue。
您不应使用带下划线的主机名。
注意:application.config.hosts.clear
在这种情况下有效。
在 Rails 6
中,当您想要允许来自 ngrok v2.3.40
的主机时,将此配置添加到 config/environments/development.rb
config.hosts << /[a-z0-9\-]+\.ap\.ngrok\.io/
重启服务器享受
要允许来自 ngrok.io
(或其他服务)的任何子域的请求,最简单的解决方案是在其前面添加 .
,如下所示:
# config/environments/development.rb
Rails.application.configure do
...
config.hosts << '.ngrok.io'
end
不需要像其他一些答案中提到的那样对子域使用正则表达式。
PS:不要像其他一些答案中提到的那样通过执行 config.hosts.clear
来禁用此功能,因为这违背了 Rails' DNS 重新绑定保护的目的,并且在在适当的情况下,外部攻击者可以获得对您本地 Rails 应用程序信息 (source) 的完全访问权限。
1st 运行 其中一个终端中的 ngrok 3000 然后打开新终端和 运行 rails s... 然后你现在可以看到 ngrok 和 rails s 都可以 运行 同时...
为了在ngrok子域名和区域中支持连字符,您需要更改config/environments/development.rb
更改config.hosts
为/[a-z0-9.-]+.ngrok.io/
示例:
config.hosts = (config.hosts rescue []) << /[a-z0-9.-]+.ngrok.io/
将此行添加到 config/environments/development.rb
config.hosts << /.+\.ngrok\.io:\d+/
我看到的大多数回复都缺少 URL 的 port 部分。如果您在特定端口(通常为 :3000
)访问此 URL,则正则表达式的 :\d+
部分是必需的。
重启服务器后即可使用。
config.hosts = nil
在 development.rb
中使用它并重新启动您的 rails 服务器,它对我有用,它会起作用。
我需要 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"
我试过重新启动,新 windows,但没有任何办法可以解决这个问题。我以前从未见过这个错误。我猜 Rails 的新版本正在做些什么?
在 Rails 6 Action Pack 中引入了 ActionDispatch::HostAuthorization 并且默认情况下仅允许 [IPAddr.new(“0.0.0.0/0”), IPAddr.new(“:: /0”),“本地主机”]
您可以像这样在文件 config/application.rb 中添加 RegExp、Proc、IPAddr 和字符串数组或单个字符串
class Application < Rails::Application
config.hosts << "xxxxxxx-xxxxxxx.c9users.io"
...
end
来自“https://drivy.engineering/rails-6-unnoticed-features”:
Rails 6 added a new middleware called ActionDispatch::HostAuthorization allowing you to whitelist some hosts for your application and preventing Host header attacks. You can easily configure it with a String, IPAddr, Proc and RegExp (useful when dealing with wildcard domains).
如果您想在您的开发环境中禁用此功能,您可以将 config.hosts.clear
添加到 config/environments/development.rb
。
Blocked Host 是 Rails 6 的新功能。您可以将此模式添加到您的 config/environments/development.rb
中,这样在使用动态 URL 时就不用担心了
config.hosts << /[a-z0-9]+\.c9users\.io/
同样对于 ngrok 用户,只需将上面的 c9users
替换为 ngrok
更新: ngrok 目前在他们的 URL 中使用 -
所以这应该是准确的 config.hosts << /[a-z0-9-]+\.ngrok\.io/
这个 article 对我有用:
第一个选项是将
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
归功于 Manfred Stienstra。
我将 Rails.application.config.hosts << "xxxxxxx-xxxxxxx.c9users.io"
添加到 config/application.rb
,它修复了我的测试应用程序。然后我对我的真实应用程序做了它并且它也有效。问题是,Devise 也抛出了一个错误,显然至少要到 Rails 6 beta 才能修复。我想我会回到 Carrierwave
以满足我的图像大小需求,直到 ActiveStorage
更加成熟。
简单solution:
将此行添加到 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
确保您使用的正则表达式允许破折号!
注意:您可以使用配置 application.config.hosts << 'your_unvalid_host_name'
将您的主机列入白名单,但仍然有错误。
在这种情况下,错误消息目前并不准确。看到这个 issue。
您不应使用带下划线的主机名。
注意:application.config.hosts.clear
在这种情况下有效。
在 Rails 6
中,当您想要允许来自 ngrok v2.3.40
的主机时,将此配置添加到 config/environments/development.rb
config.hosts << /[a-z0-9\-]+\.ap\.ngrok\.io/
重启服务器享受
要允许来自 ngrok.io
(或其他服务)的任何子域的请求,最简单的解决方案是在其前面添加 .
,如下所示:
# config/environments/development.rb
Rails.application.configure do
...
config.hosts << '.ngrok.io'
end
不需要像其他一些答案中提到的那样对子域使用正则表达式。
PS:不要像其他一些答案中提到的那样通过执行 config.hosts.clear
来禁用此功能,因为这违背了 Rails' DNS 重新绑定保护的目的,并且在在适当的情况下,外部攻击者可以获得对您本地 Rails 应用程序信息 (source) 的完全访问权限。
1st 运行 其中一个终端中的 ngrok 3000 然后打开新终端和 运行 rails s... 然后你现在可以看到 ngrok 和 rails s 都可以 运行 同时...
为了在ngrok子域名和区域中支持连字符,您需要更改config/environments/development.rb
更改config.hosts
为/[a-z0-9.-]+.ngrok.io/
示例:
config.hosts = (config.hosts rescue []) << /[a-z0-9.-]+.ngrok.io/
将此行添加到 config/environments/development.rb
config.hosts << /.+\.ngrok\.io:\d+/
我看到的大多数回复都缺少 URL 的 port 部分。如果您在特定端口(通常为 :3000
)访问此 URL,则正则表达式的 :\d+
部分是必需的。
重启服务器后即可使用。
config.hosts = nil
在 development.rb
中使用它并重新启动您的 rails 服务器,它对我有用,它会起作用。