curlでhost指定・名前解決して実行

ここ何ヶ月か、某社から「TLS1.1以下サポート終了のためテスト環境にてご確認お願いします」ってことでIPとテスト環境のドメインが送られてくることがまれによくある。。
弊社の開発サーバーではインフラチームしかsudo権限がないのでhostsファイルはいじれないけどちょっとした疎通確認のため申請出してわざわざhosts設定してもらうのは面倒なのでやらない。

そんなときにググってよく見るのはヘッダでhost指定してやるやり方

$ curl -H 'Host:example.com' http://192.168.33.10/

PHPだと

$curl = curl_init("http://192.168.33.10/");
curl_setopt($curl, CURLOPT_HTTPHEADER, ['Host: exsample.com']);

こんな感じ。

ただ、件のテスト環境ではヘッダでhost指定するやり方では動かなかったので別の方法で。 ということで見つけたのが--resolveオプション。 リクエストヘッダにHost名持たせて指定のIPアクセスするのではなくhostsファイルいじったのと同じように名前解決させるイメージでいいのかな。

$ curl --resolve example.com:80:192.168.33.10 http://example.com/

PHPだと

curl_setopt($ch, CURLOPT_RESOLVE, array("example.com:80:192.168.33.10"));

これで疎通確認できました。

まとめると
DNS登録されてないドメイン宛にリクエストする場合、

  • ヘッダでhost指定する方法
    • curl -H 'Host:{$domain}' http://{$ip}/
  • --resolveオプションで名前解決させる方法
    • curl --resolve {$domain}:80:{$ip} http://{$domain}/

2つのやり方がありますよと。