如何在 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?的主要内容,如果未能解决你的问题,请参考以下文章
如何配置 HTTP 隧道以配置我的 edx localhost 以使用 ngrok 从 Internet 访问?