【PHP8.x】CURLOPT_REFERER定数の使い方
CURLOPT_REFERER定数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
CURLOPT_REFERER定数は、PHPのcURL拡張機能において、HTTPリクエストのRefererヘッダーを表す定数です。この定数は、curl_setopt()関数と組み合わせて使用され、ウェブサーバーへ送信するHTTPリクエストに特定のRefererヘッダーの値を設定するために利用されます。
Refererヘッダーとは、ウェブブラウザがリンクをクリックして別のページに移動した際に、アクセス先のサーバーに対して「どのページからアクセスしてきたか」を伝えるHTTPヘッダー情報のことです。例えば、あるウェブサイトから別のウェブサイトへ移動した場合、アクセス先のサーバーはそのRefererヘッダーを通じて、どのページがリンク元であったかを知ることができます。
この機能は、主にウェブサーバー側でのアクセス解析やセキュリティ目的で利用されます。例えば、特定のページからのアクセスのみを許可したり、サイト全体のトラフィックパターンを分析したりする際に役立ちます。PHPでcurlを使って外部のウェブサービスにリクエストを送信する際、あたかも特定のページからアクセスしたかのように見せかけたい場合に、CURLOPT_REFERER定数を使ってRefererヘッダーの値を任意に設定することが可能です。
具体的には、curl_setopt($ch, CURLOPT_REFERER, "https://example.com/previous-page");のように記述し、第二引数にCURLOPT_REFERER定数を指定し、第三引数に参照元となるURLの文字列を設定します。これにより、送信されるHTTPリクエストには指定されたRefererヘッダーが付与され、アクセス先のサーバーはその情報を基に処理を行います。この設定は、プログラムがウェブサイトのクローリングやデータ収集を行う際に、自然なアクセスを模倣するためにも使われることがあります。ただし、プライバシーやセキュリティの観点から、Refererヘッダーの取り扱いには注意が必要です。
構文(syntax)
1<?php 2$ch = curl_init(); 3curl_setopt($ch, CURLOPT_URL, "http://example.com/target"); 4curl_setopt($ch, CURLOPT_REFERER, "http://example.com/source"); 5$response = curl_exec($ch); 6curl_close($ch); 7?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
戻り値なし
戻り値はありません
サンプルコード
PHP cURLでリダイレクトとRefererを設定してページ取得
1<?php 2 3/** 4 * 指定されたURLからコンテンツを取得します。 5 * HTTPリダイレクトに従い、特定のリファラーヘッダを設定します。 6 * 7 * @param string $url 取得したいターゲットURL 8 * @param string $referer 設定するRefererヘッダの値(オプション)。デフォルト値あり。 9 * @return string|false 成功した場合は取得したコンテンツ、失敗した場合はfalse 10 */ 11function getWebPageContent(string $url, string $referer = 'https://www.example.org/previous-page') 12{ 13 // cURLセッションを初期化します。 14 // cURLは様々なプロトコル(HTTP, HTTPS, FTPなど)でデータを転送するためのライブラリです。 15 $ch = curl_init(); 16 17 // cURLオプションを設定します。 18 // ターゲットURLを指定します。これがコンテンツを取得したいウェブサイトのアドレスです。 19 curl_setopt($ch, CURLOPT_URL, $url); 20 21 // HTTPリクエストのReferer(リファラ)ヘッダを設定します。 22 // これは、どのウェブページからこのリクエストが来たかを示す情報です。 23 // 例えば、検索結果からリンクをクリックした場合、検索エンジンのURLがリファラになります。 24 // (PHPリファレンス情報: CURLOPT_REFERER) 25 curl_setopt($ch, CURLOPT_REFERER, $referer); 26 27 // HTTPリダイレクトに自動的に従うように設定します。 28 // もし指定したURLが「このページは別のURLに移動しました」という応答(リダイレクト)を返した場合、 29 // cURLが自動的に新しいURLにアクセスし直してくれます。 30 // (キーワード: CURLOPT_FOLLOWLOCATION) 31 // 注意: このオプションは、PHPの環境設定(例: open_basedir)によっては制限される場合があります。 32 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 33 34 // curl_exec() 関数が、取得したコンテンツを直接出力するのではなく、文字列として返すように設定します。 35 // これにより、プログラム内でコンテンツを変数として扱えるようになります。 36 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 37 38 // ユーザーエージェントを設定します。 39 // これは、ウェブサイトにアクセスしているクライアントが何であるか(例: ウェブブラウザの種類やOS)を伝える情報です。 40 // 多くのウェブサイトは、適切なユーザーエージェントが設定されていないリクエストを拒否することがあります。 41 curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'); 42 43 // もしHTTPSサイトへのアクセスで「SSL証明書」に関するエラーが発生する場合、以下の2行を一時的に追加することで回避できることがあります。 44 // ただし、セキュリティ上のリスクがあるため、本番環境では証明書の検証を有効にすることを強く推奨します。 45 // curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 46 // curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); 47 48 // 設定したオプションを使ってcURLセッションを実行し、ウェブページのコンテンツを取得します。 49 $response = curl_exec($ch); 50 51 // cURLの実行中にエラーが発生したかどうかを確認します。 52 if (curl_errno($ch)) { 53 // エラーが発生した場合、エラーメッセージを表示し、falseを返します。 54 echo "cURL エラー: " . curl_error($ch) . "\n"; 55 $response = false; 56 } 57 58 // cURLセッションを閉じ、使用したリソースを解放します。 59 curl_close($ch); 60 61 // 取得したコンテンツ(またはエラーの場合はfalse)を返します。 62 return $response; 63} 64 65// --- 使用例 --- 66// コンテンツを取得したいターゲットURLを指定します。 67$targetUrl = 'http://example.com'; 68 69// もしリダイレクトの挙動を試したい場合は、以下のURLを代わりに使ってみてください。 70// このURLは最終的に http://example.com にリダイレクトされます。 71// $targetUrl = 'http://httpbin.org/redirect-to?url=http://example.com'; 72 73echo "ターゲットURLからコンテンツを取得中: {$targetUrl}\n\n"; 74 75// getWebPageContent 関数を呼び出し、コンテンツを取得します。 76$content = getWebPageContent($targetUrl); 77 78// 取得が成功したかを確認します。 79if ($content !== false) { 80 echo "コンテンツの取得に成功しました。\n"; 81 echo "取得したコンテンツの最初の200文字:\n"; 82 echo "--------------------------------------------------\n"; 83 // 取得したコンテンツの最初の200文字を表示します。 84 echo substr($content, 0, 200) . "...\n"; 85 echo "--------------------------------------------------\n"; 86} else { 87 echo "コンテンツの取得に失敗しました。\n"; 88} 89
このPHPサンプルコードは、cURLライブラリを用いてウェブページのコンテンツを取得する基本的な方法を示しています。特に、以下の二つの重要なオプションに焦点を当てています。
一つ目は、CURLOPT_REFERERです。これは、ウェブサイトへのリクエストが「どのページから来たか」という情報(Refererヘッダ)を設定するために使用します。例えば、あるリンクをクリックして別のサイトへ移動した際に、元のサイトのURLを相手に伝えるような役割を果たします。
二つ目は、CURLOPT_FOLLOWLOCATIONです。このオプションをtrueに設定することで、アクセス先のウェブサイトが別のURLへ転送(リダイレクト)を指示した場合に、cURLが自動的にその転送先のURLにアクセスし直すようになります。これにより、リダイレクトされたコンテンツも問題なく取得できるようになりますが、PHPの環境設定によっては制限を受ける可能性がある点にご注意ください。
提供されているgetWebPageContent関数は、引数として取得したいターゲットURLと、任意で設定するリファラーヘッダの値を受け取ります。関数はcURLを初期化し、これらのオプションを含む必要な設定を行った後、ウェブページの内容を取得します。成功した場合は取得したコンテンツを文字列として返し、失敗した場合はfalseを返します。これにより、プログラム内でウェブコンテンツを柔軟に扱うことが可能になります。
このサンプルコードでは、CURLOPT_FOLLOWLOCATIONオプションがPHPの環境設定(open_basedirなど)により動作が制限される可能性がある点に注意が必要です。エラーが発生した場合は、この設定を確認してください。また、コメントアウトされているCURLOPT_SSL_VERIFYPEERとCURLOPT_SSL_VERIFYHOSTをfalseにする設定は、SSL証明書の検証を無効化するためセキュリティリスクが非常に高く、本番環境では絶対に使用しないでください。CURLOPT_REFERERで設定するリファラー情報もアクセス先に送信されるため、不要な情報や機密情報を送信しないようプライバシー保護の観点から適切な値を設定することが重要です。ユーザーエージェントを適切に設定することも、ウェブサイトからのアクセス拒否を避けるために有効です。
PHP cURLでRefererを設定する
1<?php 2 3/** 4 * cURLを使用して指定されたURLにHTTPリクエストを送信し、Refererヘッダを設定するサンプルコードです。 5 */ 6function sendCurlRequestWithReferer(): void 7{ 8 // HTTPリクエストのターゲットとなるURL。 9 // 例として 'http://example.com' を使用していますが、実際にはアクセスしたいウェブサイトのURLを設定します。 10 $targetUrl = 'http://example.com'; 11 12 // Refererヘッダとして送信するURL。 13 // この値は、ターゲットURLにアクセスする「元のページ」として機能します。 14 // 例えば、ブラウザでリンクをクリックした際に、そのリンク元のページがRefererとなります。 15 $refererUrl = 'http://my-source-site.com/previous-page'; 16 17 // cURLセッションを初期化します。 18 $ch = curl_init(); 19 20 if ($ch === false) { 21 echo 'cURLセッションの初期化に失敗しました。'; 22 return; 23 } 24 25 // CURLOPT_URL: リクエストを送信するURLを設定します。 26 // これはcURLリクエストにおいて最も基本的な設定の一つです。 27 curl_setopt($ch, CURLOPT_URL, $targetUrl); 28 29 // CURLOPT_REFERER: HTTPリクエストヘッダのRefererを設定します。 30 // これを設定することで、サーバーはリクエストが「どこから来たか」を認識できるようになります。 31 curl_setopt($ch, CURLOPT_REFERER, $refererUrl); 32 33 // CURLOPT_RETURNTRANSFER: curl_exec()が結果を直接出力せず、文字列として返すようにします。 34 // これをtrueに設定しないと、レスポンスがすぐに標準出力に表示されてしまいます。 35 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 36 37 // cURLセッションを実行し、レスポンスを取得します。 38 $response = curl_exec($ch); 39 40 // エラーが発生したかチェックします。 41 if (curl_errno($ch)) { 42 $errorMsg = curl_error($ch); 43 echo "cURLエラーが発生しました: {$errorMsg}\n"; 44 } else { 45 // レスポンスを表示します (長くなる可能性があるため、先頭部分のみを抜粋)。 46 echo "cURLリクエストが成功しました。\n"; 47 echo "レスポンスの抜粋:\n"; 48 // curl_exec()は失敗時にfalseを返す可能性があるため、文字列にキャストしてから処理します。 49 $responseString = (string)$response; 50 echo mb_substr($responseString, 0, 500) . (mb_strlen($responseString) > 500 ? '...' : '') . "\n"; 51 } 52 53 // cURLセッションを閉じ、リソースを解放します。 54 curl_close($ch); 55} 56 57// 関数を実行します。 58sendCurlRequestWithReferer();
このPHPコードは、cURLライブラリを用いてHTTPリクエストを送信する際に、「Referer」ヘッダを設定する方法を初心者向けに示しています。Refererヘッダは、ウェブサイトへのアクセスが「どのページから来たのか」をサーバーに伝えるための情報として機能します。
コードではまず、curl_init()でcURLセッションを初期化します。次に、curl_setopt()関数を使用してリクエストの詳細を設定します。CURLOPT_URLは、リクエストの送信先となるターゲットURL(例: http://example.com)を指定する、cURLリクエストにおいて最も基本的な設定オプションです。一方、本サンプルの主要な対象であるCURLOPT_REFERERは、HTTPリクエストヘッダのRefererを設定するための定数です。この定数をcurl_setopt()関数に渡し、リクエスト元のURL(例: http://my-source-site.com/previous-page)を指定することで、サーバーはリクエストがどこから発されたものかを認識できます。
また、CURLOPT_RETURNTRANSFERをtrueに設定することで、curl_exec()がHTTPレスポンスを直接出力せず、PHPスクリプト内で文字列として受け取れるようになります。リクエスト実行後、エラーがないかを確認し、取得したレスポンスの抜粋を表示します。最後に、curl_close()でcURLセッションを閉じ、使用したリソースを解放します。CURLOPT_REFERERは定数であるため、引数や戻り値は持ちませんが、curl_setopt()を通じて特定のHTTPヘッダを設定する役割を果たします。
このコードを利用するには、PHP環境でcURL拡張機能が有効になっているかを確認してください。CURLOPT_REFERERはHTTPリクエスト元のURLを示すヘッダを設定しますが、ここに任意の値を設定すると、サーバーにはその設定値が「リクエスト元」として認識されます。これは偽装にあたり、ウェブサイトによってはRefererヘッダをチェックしている場合があるため、悪用は厳禁です。また、$targetUrlや$refererUrlに外部からの値を設定する際は、必ずURLのバリデーションやサニタイズを行い、セキュリティを確保することが重要です。CURLOPT_RETURNTRANSFERをtrueに設定しないと、curl_execの実行結果が画面に直接出力されてしまい、プログラムでレスポンスを扱えなくなります。本番環境では、エラー発生時の詳細なログ記録や例外処理の導入も検討しましょう。