【PHP8.x】CURLINFO_REDIRECT_URL定数の使い方
CURLINFO_REDIRECT_URL定数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
CURLINFO_REDIRECT_URL定数は、PHPのcURL拡張機能において、HTTPリクエストがリダイレクトされた際の最終的なURLを表す定数です。この定数は、curl_getinfo()関数と組み合わせて使用され、Webサーバーからの応答でリダイレクト(転送)が発生した場合に、実際にアクセスが成功した最終的なURLの情報を取得するために利用されます。
たとえば、特定のURLにアクセスを試みた際に、そのサーバーが別のURLへ自動的に誘導(301 Moved Permanentlyや302 FoundなどのHTTPステータスコードで)することがあります。このような状況で、元のURLではなく、最終的にコンテンツが取得されたURLを知りたい場合に、CURLINFO_REDIRECT_URL定数が役立ちます。
この定数を用いてリダイレクト先のURLを取得するには、事前にcurl_setopt()関数でCURLOPT_FOLLOWLOCATIONオプションをtrueに設定しておく必要があります。これにより、cURLがリダイレクトを自動的に追跡し、最終的な転送先までたどり着けるようになります。curl_getinfo()関数にCURLINFO_REDIRECT_URL定数を渡すと、リダイレクトが発生した場合の最終的なURLを表す文字列が返されます。もしリダイレクトが発生しなかったり、CURLOPT_FOLLOWLOCATIONが有効になっていなかったりした場合は、空の文字列が返されることがあります。この定数は、Webサイトの構造を解析したり、リンクの最終的な到達点を確認したりする際に重要な情報を提供します。
構文(syntax)
1<?php 2$ch = curl_init(); 3curl_setopt($ch, CURLOPT_URL, "https://httpbin.org/redirect-to?url=https://httpbin.org/get"); 4curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 5curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 6curl_exec($ch); 7$redirectUrl = curl_getinfo($ch, CURLINFO_REDIRECT_URL); 8echo $redirectUrl; 9curl_close($ch);
引数(parameters)
引数なし
引数はありません
戻り値(return)
戻り値なし
戻り値はありません
サンプルコード
PHP cURLでリダイレクトURLとレスポンスコードを取得する
1<?php 2 3/** 4 * 指定されたURLへのcURLリクエストを実行し、リダイレクト情報とHTTPレスポンスコードを取得します。 5 * 6 * この関数は、ウェブページがリダイレクトされた場合に、そのリダイレクト先のURLと、 7 * 最終的なHTTPステータスコード(例: 200 OK, 404 Not Found)を取得することを目的としています。 8 * システムエンジニアを目指す初心者の方のために、CURLINFO_REDIRECT_URL と 9 * CURLINFO_RESPONSE_CODE の両方の使い方を簡潔に示します。 10 * 11 * @param string $url リクエストを送信するターゲットURL。 12 * @return array|false 取得した情報('redirect_url', 'response_code')とエラーメッセージ('error')を 13 * 含む連想配列を返します。cURLの初期化に失敗した場合はfalseを返します。 14 */ 15function getCurlRedirectAndResponseInfo(string $url): array|false 16{ 17 // cURLセッションを初期化します。 18 // これがウェブページにアクセスするための「ブラウザのようなもの」を作成する第一歩です。 19 $ch = curl_init(); 20 21 // cURLの初期化に失敗した場合、falseが返されます。 22 if ($ch === false) { 23 return ['error' => 'cURLの初期化に失敗しました。サーバーまたはPHPの設定を確認してください。']; 24 } 25 26 // cURLオプションを設定します。これらのオプションはcURLの動作を詳細に制御します。 27 // リクエスト先のURLを指定します。 28 curl_setopt($ch, CURLOPT_URL, $url); 29 // サーバーからの応答(HTMLなど)を直接出力せず、文字列として取得するように設定します。 30 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 31 // HTTPリダイレクト(例: 301 Moved Permanently, 302 Found)があった場合に、 32 // cURLが自動的にそのリダイレクト先を追跡するように設定します。 33 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 34 // 自動的に追跡するリダイレクトの最大数を設定します。 35 // 無限リダイレクトループを防ぐため、この設定は推奨されます。 36 curl_setopt($ch, CURLOPT_MAXREDIRS, 5); 37 // リダイレクト時にRefererヘッダーを自動的に更新するように設定します。 38 curl_setopt($ch, CURLOPT_AUTOREFERER, true); 39 // サーバーからの応答にHTTPヘッダーを含めないように設定します(コンテンツのみ取得)。 40 curl_setopt($ch, CURLOPT_HEADER, false); 41 // cURL操作の最大実行時間を秒単位で設定します。 42 // 長い時間待つことによるスクリプトの停止を防ぎます。 43 curl_setopt($ch, CURLOPT_TIMEOUT, 30); 44 45 // cURLリクエストを実行します。 46 // CURLOPT_RETURNTRANSFERがtrueのため、結果は変数に格納されますが、この関数では内容自体は使用しません。 47 curl_exec($ch); 48 49 // cURL実行中にエラーが発生したかどうかを確認します。 50 if (curl_errno($ch)) { 51 $error_message = curl_error($ch); 52 // エラーが発生した場合、cURLセッションを閉じ、エラーメッセージを返します。 53 curl_close($ch); 54 return ['error' => "cURLエラーが発生しました: " . $error_message]; 55 } 56 57 // CURLINFO_REDIRECT_URL を使用して、リダイレクト先のURL情報を取得します。 58 // これは、cURLがリダイレクトを追跡する際に検出した「次に移動するURL」を示します。 59 // 注意: CURLOPT_FOLLOWLOCATION が有効な場合でも、これは最終的にアクセスしたURLではなく、 60 // リダイレクトチェーンの途中のURLを示すことがあります。 61 $redirectUrl = curl_getinfo($ch, CURLINFO_REDIRECT_URL); 62 63 // CURLINFO_RESPONSE_CODE を使用して、最終的なHTTPステータスコードを取得します。 64 // 例: 200 (成功), 404 (見つからない), 500 (サーバーエラー) など。 65 $responseCode = curl_getinfo($ch, CURLINFO_RESPONSE_CODE); 66 67 // cURLセッションを閉じ、使用したリソースを解放します。 68 curl_close($ch); 69 70 // 取得した情報を連想配列として返します。 71 return [ 72 'redirect_url' => $redirectUrl, 73 'response_code' => $responseCode, 74 'error' => null, // エラーがなければnull 75 ]; 76} 77 78// --- サンプルコードの実行例 --- 79 80// 例1: リダイレクトが発生するURLを指定します。 81// httpbin.orgは、テスト目的で利用できる公共のHTTPリクエスト&レスポンスサービスです。 82// このURLは "https://www.google.com" へリダイレクトする指示を出します。 83$testUrlWithRedirect = "https://httpbin.org/redirect-to?url=https://www.google.com"; 84echo "--- リクエストURL (リダイレクトあり) ---" . PHP_EOL; 85echo "リクエスト先: " . $testUrlWithRedirect . PHP_EOL; 86 87$infoRedirect = getCurlRedirectAndResponseInfo($testUrlWithRedirect); 88 89if ($infoRedirect === false || $infoRedirect['error'] !== null) { 90 echo "情報の取得に失敗しました: " . ($infoRedirect['error'] ?? '不明なエラー') . PHP_EOL; 91} else { 92 echo " [取得情報]" . PHP_EOL; 93 // CURLINFO_REDIRECT_URL の値が表示されます。 94 echo " CURLINFO_REDIRECT_URL: " . ($infoRedirect['redirect_url'] ?: 'なし') . PHP_EOL; 95 // 最終的なHTTPレスポンスコードが表示されます(リダイレクト追跡後のコード)。 96 echo " CURLINFO_RESPONSE_CODE: " . $infoRedirect['response_code'] . PHP_EOL; 97 98 echo PHP_EOL; 99 echo " 補足: CURLINFO_REDIRECT_URL は、cURLがリダイレクトを検出した際の「次にリダイレクトされるはずのURL」を示します。" . PHP_EOL; 100 echo " CURLOPT_FOLLOWLOCATION が有効な場合、cURLはそのURLを追跡し、最終的なコンテンツを取得します。" . PHP_EOL; 101 echo " リダイレクト後の最終的なURLは、CURLINFO_EFFECTIVE_URL で取得できますが、この例では割愛しています。" . PHP_EOL; 102} 103 104echo PHP_EOL; 105 106// 例2: リダイレクトしない一般的なURLを指定します。 107$testUrlNoRedirect = "https://www.example.com"; 108echo "--- リクエストURL (リダイレクトなし) ---" . PHP_EOL; 109echo "リクエスト先: " . $testUrlNoRedirect . PHP_EOL; 110 111$infoNoRedirect = getCurlRedirectAndResponseInfo($testUrlNoRedirect); 112 113if ($infoNoRedirect === false || $infoNoRedirect['error'] !== null) { 114 echo "情報の取得に失敗しました: " . ($infoNoRedirect['error'] ?? '不明なエラー') . PHP_EOL; 115} else { 116 echo " [取得情報]" . PHP_EOL; 117 // リダイレクトがないため、CURLINFO_REDIRECT_URL は空または表示されません。 118 echo " CURLINFO_REDIRECT_URL: " . ($infoNoRedirect['redirect_url'] ?: 'なし') . PHP_EOL; 119 // 正常なHTTPレスポンスコードが表示されます。 120 echo " CURLINFO_RESPONSE_CODE: " . $infoNoRedirect['response_code'] . PHP_EOL; 121}
このサンプルコードは、PHPのcURL拡張機能を利用し、指定されたURLへのリクエストにおけるリダイレクト情報とHTTPレスポンスコードを取得する方法を、システムエンジニアを目指す初心者の方に簡潔に示しています。
getCurlRedirectAndResponseInfo 関数は、引数にターゲットURL($url)を受け取ります。内部ではcURLセッションを初期化し、CURLOPT_FOLLOWLOCATIONオプションを有効にすることで、HTTPリダイレクトが自動的に追跡されるように設定しています。これにより、ウェブページが別のURLへ移動した場合でも、その追跡が可能です。
curl_exec 関数でリクエストを実行した後、curl_getinfo 関数を使用し、CURLINFO_REDIRECT_URL 定数で、cURLがリダイレクトを検出した際の「次にリダイレクトされるはずのURL」を取得できます。リダイレクトが発生しなかった場合は、この情報は空となります。同時に、CURLINFO_RESPONSE_CODE 定数を用いることで、リダイレクトをすべて追跡し終えた後の、最終的なHTTPステータスコード(例: 200 OK, 404 Not Found)を取得します。
この関数は、これらの取得情報と、発生した場合はエラーメッセージを含む連想配列を戻り値として返します。cURLの初期化自体に失敗した際にはfalseを返す設計です。このコードは、外部サービスのURL変更検知や、ウェブサイトの健全性チェックといった場面で活用できます。
CURLINFO_REDIRECT_URLは、cURLが次にリダイレクトしようとしたURLを示すため、リダイレクト先の最終URLとは異なる場合があります。最終的にアクセスしたURLはCURLINFO_EFFECTIVE_URLで確認できます。CURLINFO_RESPONSE_CODEは、リダイレクト追跡後の最終的なHTTPステータスコードです。リダイレクトを安全に追跡するためには、CURLOPT_FOLLOWLOCATIONの有効化に加え、無限リダイレクトを防ぐCURLOPT_MAXREDIRS、処理停止を防ぐCURLOPT_TIMEOUTの設定が重要です。また、curl_init()やcurl_exec()後のエラーチェックと、curl_close()によるリソースの解放を忘れないでください。これらの注意点を守り、安定したコード作成を目指しましょう。
PHP cURLでリダイレクトURLとHTTPコードを取得する
1<?php 2 3/** 4 * 指定されたURLに対してcURLリクエストを実行し、 5 * リダイレクト先のURLとHTTPステータスコードを取得して表示します。 6 * 7 * @param string $url リクエストを送信するURL。 8 * @return void 9 */ 10function getCurlRedirectInfo(string $url): void 11{ 12 // cURLセッションを初期化します。 13 $ch = curl_init(); 14 15 // cURLオプションを設定します。 16 // アクセスするURLを指定します。 17 curl_setopt($ch, CURLOPT_URL, $url); 18 // cURLが自動的にリダイレクトを追跡するように設定します。 19 // これにより、最終的なリダイレクト先の情報を取得できます。 20 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 21 // curl_exec() の結果を文字列として返すように設定します。 22 // (この例では結果は表示しませんが、一般的な設定です) 23 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 24 25 // cURLセッションを実行します。 26 // ここで実際にウェブサイトにアクセスが行われます。 27 curl_exec($ch); 28 29 // エラーが発生した場合は、エラーメッセージを表示して処理を終了します。 30 if (curl_errno($ch)) { 31 echo "cURLエラー: " . curl_error($ch) . PHP_EOL; 32 curl_close($ch); 33 return; 34 } 35 36 // cURL転送に関する情報を取得します。 37 // CURLINFO_HTTP_CODE: HTTPステータスコード(例: 200 OK, 301 Moved Permanently)を取得します。 38 $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); 39 // CURLINFO_REDIRECT_URL: リダイレクトが発生した場合の最終的なURLを取得します。 40 $redirectUrl = curl_getinfo($ch, CURLINFO_REDIRECT_URL); 41 42 // cURLセッションを閉じます。 43 // リソースを解放するために重要です。 44 curl_close($ch); 45 46 // 取得した情報を表示します。 47 echo "--- URL情報 ---" . PHP_EOL; 48 echo "元のURL: " . $url . PHP_EOL; 49 echo "HTTPステータスコード: " . $httpCode . PHP_EOL; 50 51 // リダイレクト先のURLがある場合は表示します。 52 if (!empty($redirectUrl)) { 53 echo "リダイレクト先の最終URL: " . $redirectUrl . PHP_EOL; 54 } else { 55 echo "リダイレクトは発生しませんでした、またはリダイレクト情報が取得できませんでした。" . PHP_EOL; 56 } 57 echo "-----------------" . PHP_EOL; 58} 59 60// 関数を呼び出してテストします。 61// 例1: リダイレクトが発生する可能性のあるURL 62// (例: httpbin.org はテスト用のHTTPサービスを提供しています) 63getCurlRedirectInfo('http://httpbin.org/redirect-to?url=http://example.com'); 64 65// 例2: リダイレクトが発生しない一般的なURL 66getCurlRedirectInfo('https://www.php.net/'); 67 68?>
このサンプルコードは、指定されたURLへHTTPリクエストを送信し、その応答情報としてリダイレクト先の最終URLとHTTPステータスコードを取得・表示するものです。
getCurlRedirectInfo関数は、リクエスト対象のURLを引数$urlとして受け取ります。この関数の戻り値はvoidであり、値を返さずに処理結果を直接画面に出力します。
コードの実行は、まずcurl_init()でcURLセッションを初期化することから始まります。次に、curl_setopt()を使用して必要なオプションを設定します。特に重要なのはCURLOPT_FOLLOWLOCATIONをtrueに設定する部分で、これによりcURLは自動的にリダイレクトを追跡し、最終的なリダイレクト先の情報を取得できるようになります。
その後、curl_exec()で実際にURLへのリクエストを実行します。リクエストが完了したら、curl_getinfo()関数を用いて転送に関する情報を取得します。ここでCURLINFO_REDIRECT_URL定数を使用することで、リダイレクトが発生した場合の最終的なURLを取得できます。また、CURLINFO_HTTP_CODE定数を使用してHTTPステータスコード(例: 200 OK, 301 Moved Permanentlyなど)も取得しています。
取得したリダイレクト先のURLとHTTPステータスコードは画面に表示され、ウェブサイトの接続状況や転送経路を確認するのに役立ちます。最後にcurl_close()でcURLセッションを終了し、使用したリソースを解放します。
このサンプルコードでは、cURLでリダイレクトを正しく追跡するためにはCURLOPT_FOLLOWLOCATIONオプションの設定が不可欠です。処理の最後にはcurl_close()を呼び出し、必ずcURLセッションのリソースを解放してください。ネットワーク通信では予期せぬエラーが発生しやすいため、curl_errno()によるエラーチェックは常に実施し、安全にコードを運用することが重要です。また、CURLINFO_REDIRECT_URLはリダイレクトが発生しない場合や、最終的なURLが取得できない場合には空となることがあります。外部URLへのアクセス時は、セキュリティリスクを考慮し、信頼できるURLのみを利用するよう注意してください。