はじめに
コマンドラインのcurlでは、--resolve
オプションを利用することで、DNSやhostsを利用せずに指定されたドメイン(FQDN)の名前解決を行うことができます。
※-H 'Host: example.jp'
のようにリクエストヘッダとしてHostを渡すことでも同様の対応は可能ですが、HTTPSの場合SNIを考慮する必要がある(リクエストヘッダとしてHostを渡す方法だけではSNIを考慮することができない)ため、 基本的にはリクエストヘッダではなく --resolve
オプションを使うのがベターです。
この方法は、本番環境移行時におけるDNS切替前のリリース前確認(バックエンド内のAPI通信の動作確認)のような場面において非常に役立ちます。また、DNSやhostsの変更が行えない開発環境・検証環境においても有効です(レンタルサーバ、PaaS/FaaS、自分が管理者ではないサーバ等)。
PHPのcurl拡張モジュールで --resolve
オプションを利用する
PHPのcurl拡張モジュールで --resolve
オプションを利用する場合は、次のように指定します。
curl_setopt($ch, CURLOPT_RESOLVE, [$fqdn . ':'. $port . ':127.0.0.1']);
$fqdn
リクエスト先サイト(システム)のFQDN
$port
リクエスト先サーバ(ホスト)のTCPポート番号
127.0.0.1
リクエスト先サーバ(ホスト)のIPアドレス
コード
以下のコードは、Wordpressのプラグインやテーマファイル上でcurlを利用する例になります。Wordpressでは home_url()
で公開URLを取得することができますので、こちらの値を加工してFQDNとして活用することとします。
なお、以下では移行環境や開発環境、検証環境を想定して CURLOPT_SSL_VERIFYPEER
を false
(サーバ証明書を検証しない)を追加しています。こちらは環境に応じて要否を判断のうえ、必要であれば追加し、不要であれば削除します。
<?php
$url = home_url() . '/hoge';
$fqdn = str_replace(['https://','http://'],['',''],home_url());
if (! isset($port)) {
$port = strpos(home_url(), 'https://') !== false ? '443' : '80';
}
curl_setopt($ch, CURLOPT_RESOLVE, [$fqdn . ':'. $port . ':127.0.0.1']);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
$result = curl_exec($ch);
curl_close($ch);