向同一主机但不同的主机IP发送HTTPS get请求

向同一主机但不同的主机IP发送HTTPS get请求,https,erlang,elixir,httpoison,Https,Erlang,Elixir,Httpoison,我想向同一台主机发送HTTPS请求,但我想每次都选择目标IP 例如,“dig digitalocean.com”显示以下IP: digitalocean.com. 300 IN A 104.16.110.208 digitalocean.com. 300 IN A 104.16.112.208 digitalocean.com. 300 IN A 104.16.109.208 digitalocean.com. 300 IN A 104.16.113.20

我想向同一台主机发送HTTPS请求,但我想每次都选择目标IP

例如,“dig digitalocean.com”显示以下IP:

digitalocean.com.   300 IN  A   104.16.110.208
digitalocean.com.   300 IN  A   104.16.112.208
digitalocean.com.   300 IN  A   104.16.109.208
digitalocean.com.   300 IN  A   104.16.113.208
digitalocean.com.   300 IN  A   104.16.111.208
通过HTTP,它可以工作:

HTTPoison.get("http://104.16.110.208/", [{"host","www.digitalocean.com"}])
{:ok,
 %HTTPoison.Response{body: "", headers: [...], request_url: "http://104.16.110.208/",
  status_code: 301}}
但使用HTTPS时,我会遇到一个错误:

HTTPoison.get("https://104.16.110.208/", [{"host", "www.digitalocean.com"}])
{:error,
 %HTTPoison.Error{id: nil,
  reason: {:options, {{:server_name_indication, '104.16.110.208'}}}}}

有没有一种方法可以通过HTTPS和HTTPoison实现这一点,或者在Elixir/Erlang中实现这一点,而不需要修改etc/hosts?

您需要像下面这样使用它

HTTPoison.get("https://104.16.110.208/", [{"host","www.digitalocean.com"}], hackney: [{:ssl_options, [{:server_name_indication, "digitalocean.com"}]}])

由于您正在使用IP进行连接,因此默认情况下,
服务器名称指示将假定为IP。这是您在案例中需要覆盖的内容


如果不允许不安全的https,我不知道这是否可行(我需要使用
--unsecure
也使用
curl
发出此请求),但这是有效的:
HTTPoison.get(“https://104.16.110.208/“,[{“主机”,“www.digitalocean.com”}],hackney:[:不安全]
@Dogbert-thx,这很有意义。但是我复制了你的HTTPoison线路,对我来说,它不起作用。你能告诉我它为你运行的版本吗?我发现了如何使用curl
https://DOMAIN.TLD--resolve'DOMAIN.TLD:443:IP_ADDRESS'
实现它。但我不知道如何在Erlang/Elixir中按请求执行。你能把这一点放在问题中吗?我有(几乎是,但HTTPotion作为elixir lib)相同的问题…基本上类似于“我正在寻找一个相当于
curl
--resolve
选项”尝试在
hackney
中添加
ssl\u选项,并将
服务器名称设置为
www.digitalocean.com
。看见问题是,如果您不提供SNI名称,那么它将从您在连接到几乎正常工作的服务器时使用的主机名/IP中使用。我不得不对ssl\u选项使用单引号(上面提到了一些错误,这很有意义,因为它是一个erlang库,应该有“erlang引号”)。另外,我认为格式可以改进
get(…,hackney:[ssl\u options:[server\u name\u indication:'digitalocean.com]])”
为我工作。@PatrickJ.S.,感谢您的反馈。用同样的方法更新了答案
HTTPoison.get("https://104.16.110.208/", [{"host","www.digitalocean.com"}], hackney: [ssl_options: [server_name_indication: 'digitalocean.com']])