0
0

PHPのcurl拡張モジュールでDNSやhostsを使わずに名前解決する方法

Posted at

はじめに

コマンドラインの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_VERIFYPEERfalse (サーバ証明書を検証しない)を追加しています。こちらは環境に応じて要否を判断のうえ、必要であれば追加し、不要であれば削除します。

<?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);
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0