【PHP8.x】CURLINFO_EFFECTIVE_URL定数の使い方
CURLINFO_EFFECTIVE_URL定数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
CURLINFO_EFFECTIVE_URL定数は、PHPのcURL拡張機能において、実行されたHTTPリクエストの最終的なURLを表す定数です。cURLは、ウェブサーバーとデータをやり取りするための機能を提供し、ウェブページの取得やAPI連携などで幅広く利用されます。この定数は、cURLセッションが完了した後に、curl_getinfo()関数と組み合わせて使用することで、実際にアクセスされたURLを取得するために用いられます。
ウェブサイトにアクセスする際、指定したURLが自動的に別のURLへ転送される「リダイレクト」が発生することがよくあります。例えば、ウェブサイトのアドレスがHTTPからHTTPSへ変更された場合や、一時的なページへ誘導される場合などです。CURLINFO_EFFECTIVE_URL定数を利用すると、このようなリダイレクトが発生した場合でも、最初にリクエストしたURLではなく、ブラウザが最終的に表示する、実際にデータが取得されたURLを正確に把握できます。
この情報は、通信がどのように行われたかを追跡したり、ログに記録したり、デバッグ作業を行う上で非常に重要です。特に、複数のリダイレクトを含む複雑なウェブサービスやAPIとの連携処理では、この最終URLの確認が、処理の成功可否の判断や、その後のアプリケーションの動作を決定するために不可欠となります。この定数を使用することで、開発者はHTTP通信の詳細を深く理解し、より堅牢で信頼性の高いアプリケーションを構築することができます。
構文(syntax)
1<?php 2$ch = curl_init(); 3curl_setopt($ch, CURLOPT_URL, "https://www.example.com"); 4curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 5curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 6 7curl_exec($ch); 8 9$effectiveUrl = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL); 10echo $effectiveUrl; 11 12curl_close($ch);
引数(parameters)
引数なし
引数はありません
戻り値(return)
戻り値なし
戻り値はありません
サンプルコード
PHP cURLで最終URLを取得する
1<?php 2 3/** 4 * 指定されたURLにcURLリクエストを送信し、最終的にアクセスしたURL(有効なURL)を取得します。 5 * 6 * CURLINFO_EFFECTIVE_URL を使用して、リダイレクト後の最終的なURLを確認する例です。 7 * 8 * @param string $initialUrl リクエストを送信する初期URL。 9 * @return string|false 最終的にアクセスしたURL、またはcURLエラーが発生した場合はfalse。 10 */ 11function getEffectiveUrlExample(string $initialUrl) 12{ 13 // 1. cURLセッションを初期化します。 14 $ch = curl_init(); 15 16 // 2. cURLオプションを設定します。 17 // アクセスするURLを指定します。 18 curl_setopt($ch, CURLOPT_URL, $initialUrl); 19 // サーバーからの応答を文字列として取得するように設定します。 20 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 21 // HTTPリダイレクトが発生した場合に、自動的にそのリダイレクト先を追跡するように設定します。 22 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 23 // HTTPS接続時にSSL証明書の検証を行いますが、テスト目的で無効にする場合は以下をコメント解除してください。 24 // curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 25 // curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); 26 27 28 // 3. cURLセッションを実行し、サーバーからの応答を取得します。 29 $response = curl_exec($ch); 30 31 // 4. cURL実行中にエラーが発生したか確認します。 32 if (curl_errno($ch)) { 33 echo 'cURLエラー: ' . curl_error($ch) . "\n"; 34 curl_close($ch); 35 return false; 36 } 37 38 // 5. CURLINFO_EFFECTIVE_URL を使って、最終的にアクセスしたURLを取得します。 39 // この定数は、リダイレクトを追跡した後の、最終的なURLを返します。 40 $effectiveUrl = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL); 41 42 // 6. cURLセッションを閉じ、リソースを解放します。 43 curl_close($ch); 44 45 return $effectiveUrl; 46} 47 48// --- サンプルコードの実行例 --- 49 50echo "--- リダイレクトが発生する場合の例 ---\n"; 51// リダイレクトを発生させるテスト用のURL。例: https://httpbin.org/redirect/1 は一度リダイレクトします。 52$testUrlWithRedirect = 'https://httpbin.org/redirect/1'; 53echo "初期リクエストURL: " . $testUrlWithRedirect . "\n"; 54 55$finalUrlWithRedirect = getEffectiveUrlExample($testUrlWithRedirect); 56 57if ($finalUrlWithRedirect !== false) { 58 echo "最終的にアクセスしたURL (CURLINFO_EFFECTIVE_URL): " . $finalUrlWithRedirect . "\n"; 59 echo "初期URLと最終URLが異なる場合、リダイレクトが発生したことを示します。\n"; 60} else { 61 echo "有効なURLの取得に失敗しました。\n"; 62} 63 64echo "\n--- リダイレクトが発生しない場合の例 ---\n"; 65// リダイレクトが発生しない一般的なURL。 66$testUrlNoRedirect = 'https://www.php.net/'; 67echo "初期リクエストURL: " . $testUrlNoRedirect . "\n"; 68 69$finalUrlNoRedirect = getEffectiveUrlExample($testUrlNoRedirect); 70 71if ($finalUrlNoRedirect !== false) { 72 echo "最終的にアクセスしたURL (CURLINFO_EFFECTIVE_URL): " . $finalUrlNoRedirect . "\n"; 73 echo "初期URLと最終URLが同じ場合、リダイレクトが発生しなかったことを示します。\n"; 74} else { 75 echo "有効なURLの取得に失敗しました。\n"; 76} 77 78?>
PHPのcURL拡張機能で使用されるCURLINFO_EFFECTIVE_URLは、ウェブサイトへのHTTPリクエストを送信した際に、リダイレクトを追跡した後の最終的なアクセス先URLを取得するための定数です。このサンプルコードのgetEffectiveUrlExample関数は、指定された初期URLに対してcURLリクエストを実行し、最終的にアクセスしたURLを取得する流れを示しています。
まずcurl_init()でcURLセッションを初期化し、curl_setopt()で様々なオプションを設定します。CURLOPT_URLでリクエスト先のURLを、CURLOPT_RETURNTRANSFERでサーバー応答を文字列として受け取る設定を行います。特に重要なのはCURLOPT_FOLLOWLOCATIONで、これをtrueに設定することで、HTTPリダイレクトがあった場合にcURLが自動的にリダイレクト先を追跡するようにします。
リクエストはcurl_exec()で実行され、エラーがなければ、curl_getinfo()関数にCURLINFO_EFFECTIVE_URLを渡すことで、リダイレクトを全て追跡した後の最終的なURLを取得できます。getEffectiveUrlExample関数の引数$initialUrlは、最初にリクエストを送信するURLです。戻り値は、正常に最終URLが取得できた場合はそのURL文字列、cURLエラーが発生した場合はfalseとなります。実行例では、リダイレクトが発生するURLと発生しないURLの両方を試しており、取得された最終URLが初期URLと同じか異なるかで、実際にリダイレクトが起きたかどうかを判断できることがわかります。
このサンプルコードでは、CURLINFO_EFFECTIVE_URLをcurl_getinfo()関数と組み合わせて、HTTPリダイレクトが発生した場合の最終的なアクセスURLを取得しています。リダイレクトを正しく追跡するためには、curl_setopt()でCURLOPT_FOLLOWLOCATIONオプションをtrueに設定することが非常に重要です。この設定がないと、リダイレクトを追跡せず、最初に指定したURLがそのまま返される可能性があります。また、cURL通信中にエラーが発生した際に備え、curl_errno()やcurl_error()を用いてエラーチェックを行う習慣をつけましょう。処理の最後には、必ずcurl_close()を呼び出して、セッションのリソースを適切に解放してください。さらに、セキュリティ強化のため、本番環境ではSSL証明書の検証オプション(CURLOPT_SSL_VERIFYPEER, CURLOPT_SSL_VERIFYHOST)を有効にすることを推奨します。