如何在 Rails 6 中将我的 Ngrok 隧道动态添加到 config.hosts?

Posted

技术标签:

【中文标题】如何在 Rails 6 中将我的 Ngrok 隧道动态添加到 config.hosts?【英文标题】:How do I dynamically add my Ngrok tunnel to config.hosts in Rails 6? 【发布时间】:2020-06-01 23:34:24 【问题描述】:

我正在尝试将我的 ngrok 隧道主机名列入 config.hosts 的白名单,但每次启动 Ngrok 时它都会发生变化。有没有办法获取我的 Ngrok 隧道的公共 url,这样我就不必使用hosts.clear

【问题讨论】:

【参考方案1】:

Ngrok 有一个内置的 JSON API,可以在 localhost:4040/api/tunnels 上找到。

# lib/ngrok_client.rb
module NgrokClient
  def self.tunnels
    response = Net::HTTP.get(URI('http://localhost:4040/api/tunnels'))
    begin
      JSON.parse(response).dig("tunnels")
    rescue JSON::ParserError => e
      Rails.logger.error %q
        Failed to parse reponse from Ngroks internal API. Are you sure its running?
      
    end
  end
  def self.public_urls
    tunnels.select do |h|
      # TODO - don't hardcode the host name
      h.dig("config", "addr") == "http://localhost:3000"
    end.map  |h| URI(h["public_url"]).hostname .uniq
  end
end
# config/environments/development.rb
Rails.application.configure do
  # ...
  require 'ngrok_client'
  config.hosts += NgrokClient.public_urls
end

还有 ngrok-tunnel gem 可用于从中间件层启动 ngrok,作为一个不那么 hacky 的灵魂。

【讨论】:

【参考方案2】:

只需像这样配置config/environments/development.rb

Rails.application.configure do

  ...

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

这将允许来自ngrok.io 的任何子域的请求。

【讨论】:

谢谢,我真的不记得为什么我没有寻求这么简单的解决方案。当时可能不可能。

以上是关于如何在 Rails 6 中将我的 Ngrok 隧道动态添加到 config.hosts?的主要内容,如果未能解决你的问题,请参考以下文章

连接到 *** 时如何使用 ngrok 进行隧道传输?

如何配置 HTTP 隧道以配置我的 edx localhost 以使用 ngrok 从 Internet 访问?

如何使用 ngrok 隧道使 spring social facebook 在 localhost 上工作

如何在 google colab 中使用 ngrok?

Ngrok 隧道 https 通过配置

如何调试 ngrok 隧道暴露的远程 JVM