このLaravelプロキシ統合ガイドを読み終えると、以下のことが理解できるようになります:
- プロキシとは何か、Laravelでどのように機能するか
- いつ、なぜそれが必要になるか
- Laravelプロジェクトでプロキシを設定する方法
- Laravelでプロキシ認証、SSL証明書の問題、IPローテーションを処理する方法
- Symfonyの
HttpClientコンポーネントにプロキシを統合する方法
さっそく始めましょう!
Laravel Proxyとは?
Laravelプロキシは、Laravelのバックエンドと外部サーバーとの間の仲介役として機能します。これにより、サーバーのトラフィックをプロキシサーバー経由でプログラム的にルーティングし、IPアドレスを隠すことができます。
Laravelにおけるプロキシの仕組みは以下の通りです:
- Laravelは、プロキシが設定されたHTTPクライアントライブラリを使用してHTTPリクエストを送信します。
- リクエストはプロキシサーバーを経由します。
- プロキシはそれを宛先サーバーに転送します。
- 宛先サーバーはプロキシに応答します。
- プロキシはそのレスポンスをLaravelに返します。
その結果、宛先サーバーはリクエストがLaravelサーバーからではなく、プロキシのIPから来ているように認識します。この仕組みは、地域制限の回避、匿名性の向上、レート制限の管理に役立ちます。
Laravelにおけるプロキシのユースケース
Laravelでのプロキシは多くのシナリオで役立ちますが、特に以下の3つが一般的です:
- ウェブスクレイピング: ウェブスクレイピングAPIを構築する際に、IP禁止、レート制限、その他のブロックを回避するためにプロキシを使用します。詳しくは、Laravelでのウェブスクレイピングに関するチュートリアルをご覧ください。
- サードパーティAPIのレート制限を回避する: プロキシIPをローテーションさせて、API使用量の割り当て内に収め、スロットリングを回避します。
- 地域制限のあるコンテンツへのアクセス: 特定の地域のプロキシサーバーを選択して、特定の国でのみ利用可能なサービスにアクセスします。
さらに多くの例については、ウェブデータとプロキシのユースケースに関するガイドをご覧ください。
Laravelでのプロキシの使い方:ステップバイステップガイド
このセクションでは、デフォルトのHTTPクライアントを使用してLaravelにプロキシを統合する方法を紹介します。Symfony HttpClientのユーザーの方もご心配なく—そのライブラリとのプロキシ統合についても記事の後半で扱います。
注: LaravelのHTTPクライアントはGuzzleをベースに構築されているため、Guzzleプロキシ統合ガイドも参照することをお勧めします。
統合を実演するために、以下の機能を持つGET /api/v1/get-ipエンドポイントを作成します:
- 設定されたプロキシを使用して
https://httpbin.io/ipにGETリクエストを送信します。 - レスポンスから出口IPアドレスを取得します。
- そのIPをLaravelエンドポイントを呼び出すクライアントに返します。
すべてが正しく設定されていれば、そのAPIが返すIPはプロキシのIPと一致します。
さっそく始めましょう!
ステップ1: プロジェクトのセットアップ
すでにLaravelアプリケーションがセットアップされている場合は、このステップをスキップしてステップ2に進んでください。
そうでない場合は、以下の手順に従って新しいLaravelプロジェクトを作成してください。ターミナルを開き、以下のComposer create-commandコマンドを実行して、新しいLaravelプロジェクトを初期化します:
composer create-project laravel/laravel laravel-proxies-application
このコマンドは、laravel-proxies-applicationという名前のフォルダに新しいLaravelプロジェクトを生成します。このフォルダをお好みのPHP IDEで開いてください。
この時点で、上記のフォルダにはデフォルトのLaravelファイル構造が含まれているはずです:

素晴らしい!これでLaravelプロジェクトが整いました。
ステップ2: テスト用APIエンドポイントの定義
プロジェクトディレクトリ内で、以下のArtisanコマンドを実行して新しいコントローラーを生成します:
php artisan make:controller IPController
これにより、/app/Http/ControllersディレクトリにIPController.phpという名前のファイルが、以下のデフォルトの内容で作成されます:
<?php
namespace AppHttpControllers;
use IlluminateHttpRequest;
class IPController extends Controller
{
//
}
では、以下のgetIP()メソッドをIPController.phpに追加します:
public function getIP(): JsonResponse
{
// make a GET request to the "/ip" endpoint to get the IP of the server
$response = Http::get('https://httpbin.io/ip');
// retrieve the response data
$responseData = $response->json();
// return the response data
return response()->json($responseData);
}
このメソッドはLaravelのHttpクライアントを使用してhttps://httpbin.io/ipからあなたのIPアドレスを取得し、JSONとして返します。
以下の2つのインポートを忘れずに行ってください:
use IlluminateHttpJsonResponse;
use IlluminateSupportFacadesHttp;
Laravelアプリケーションでステートレスなapiを提供したいので、install:api Artisanコマンドを使ってAPIルーティングを有効にします:
php artisan install:api
このメソッドをAPIエンドポイントとして公開するために、以下のルートをroutes/api.phpファイルに追加します:
use AppHttpControllersIPController;
Route::get('/v1/get-ip', [IPController::class, 'getIP']);
新しいAPIエンドポイントは以下でアクセス可能になります:
/api/v1/get-ip
注: デフォルトでは、各LaravelのAPIは/apiパスの下で利用可能であることに留意してください。
/api/v1/get-ipエンドポイントをテストしましょう!
以下を実行してLaravel開発サーバーを起動します:
php artisan serve
これでサーバーはローカルでポート8000でリッスンしているはずです。
cURLを使用して/api/v1/get-ipエンドポイントにGETリクエストを送信します:
curl -X GET 'http://localhost:8000/api/v1/get-ip'
注: Windowsでは、curlをcurl.exeに置き換えてください。詳しくはcURLでGETリクエストを送信する方法に関するガイドをご覧ください。
以下のようなレスポンスが得られるはずです:
{
"origin": "45.89.222.18"
}
上記のレスポンスは、HttpBinの/ipエンドポイントが生成するものとまったく同じであり、これはLaravel APIが正常に動作していることを確認するものです。特に、表示されているIPアドレスはあなたのマシンのパブリックIPです。次は、そのIPを隠すためにプロキシを統合しましょう!
ステップ3: プロキシの取得
Laravelアプリケーションでプロキシを使用するには、まず動作するプロキシサーバーへのアクセスが必要です。
多くのウェブサイトが無料のプロキシURLを提供していますが、注意が必要です—プロキシインフラを維持するにはコストがかかります。サービスが無料でプロキシを提供している場合、どのように資金調達しているのか考えてみてください。多くの場合、データ収集やトラフィックの不正な経由といった、あやしい手法が関わっています。
注: 無料のプロキシは、本番環境では絶対に使用せず、テストや学習目的のみに厳格に使用してください。
信頼できるプロキシが必要な場合は、無料トライアルや限定無料プランを提供している信頼できるプロバイダーを選んでください。
さて、典型的なプロキシURLは以下のような形式です:
<protocol>://<host>:<port>
ここで:
protocolはプロキシサーバーへの接続に必要なプロトコルです(例:http、https、socks5)hostはプロキシサーバーのIPアドレスまたはドメインですportはトラフィックのルーティングに使用されるポートです
この例では、プロキシURLを以下と仮定します:
http://66.29.154.103:3128
それをgetIP()メソッド内の変数に保存します:
$proxyUrl = 'http://66.29.154.103:3128';
LaravelでHttpにプロキシを使用する方法を見てみましょう!
ステップ4: Httpにプロキシを統合する
Httpクライアントを使用してLaravelにプロキシを統合するには、わずかな追加設定だけが必要です:
$proxyUrl = 'http://66.29.154.103:3128';
$response = Http::withOptions([
'proxy' => $proxyUrl
])->get('https://httpbin.io/ip');
$responseData = $response->json();
ご覧の通り、必要なのはwithOptions()メソッドを使ってプロキシURLをオプションとして渡すことだけです。これにより、LaravelのHTTPクライアントは、Guzzleのproxyオプションを使って、リクエストを指定されたプロキシサーバー経由でルーティングするようになります。
素晴らしい!Laravelプロキシの統合が完了しました。
ステップ5: すべてをまとめる
プロキシ統合済みの最終的なLaravel APIロジックは以下のようになるはずです:
<?php
namespace AppHttpControllers;
use IlluminateHttpRequest;
use IlluminateHttpJsonResponse;
use IlluminateSupportFacadesHttp;
class IPController extends Controller
{
public function getIP(): JsonResponse
{
// the URL of the proxy server
$proxyUrl = 'http://66.29.154.103:3128'; // replace with your proxy URL
// make a GET request to /ip endpoint through the proxy server
$response = Http::withOptions([
'proxy' => $proxyUrl
])->get('https://httpbin.io/ip');
// retrieve the response data
$responseData = $response->json();
// return the response data
return response()->json($responseData);
}
}
Laravelをローカルで実行してテストします:
php artisan serve
そして再び/api/v1/get-ipエンドポイントに接続します:
curl -X GET 'http://localhost:8000/api/v1/get-ip'
今回は、以下のような出力が得られるはずです:
{
"origin": "66.29.154.103"
}
"origin"フィールドにはプロキシサーバーのIPアドレスが表示されており、これはあなたの実際のIPがプロキシの背後に隠れていることを確認しています。
警告: 無料のプロキシサーバーは不安定であったり短命であったりすることが多いです。これを試す頃には、例のプロキシが機能しなくなっている可能性があります。必要に応じて、テスト前に$proxyUrlを現在稼働中のものに置き換えてください。
注: リクエスト送信時にSSLエラーが発生した場合は、以下の高度なユースケースのセクションで提供されているトラブルシューティングのヒントをご覧ください。
高度なユースケース
Laravelとのプロキシ統合の基本を学びましたが、検討すべきさらに高度なシナリオがあります。
プロキシ認証
プレミアムプロキシは、認証されたユーザーのみがアクセスできるよう認証を要求することがよくあります。その場合、正しい認証情報を指定しないと、以下のエラーが発生します:
cURL error 56: CONNECT tunnel failed, response 407
認証付きプロキシのURLは通常、以下の形式に従います:
<protocol>://<username>:<password>@<host>:<port>
ここでusernameとpasswordはあなたの認証情報です。
LaravelのHttpクラス(内部的にはGuzzleベース)は認証付きプロキシを完全にサポートしています。そのため、大きな変更は必要ありません。プロキシURLに直接認証情報を含めるだけです:
$proxyUrl = '<protocol>://<username>:<password>@<host>:<port>';
例えば:
// authenticated proxy with username and password
$proxyUrl = 'http://<username>:<password>@<host>:<port>';
$response = Http::withOptions([
'proxy' => $proxyUrl
])->get('https://httpbin.io/ip');
$proxyUrlの値を有効な認証付きプロキシURLに置き換えてください。
これでHttpは設定された認証付きプロキシサーバーにトラフィックをルーティングするようになります!
SSL証明書の問題を回避する
LaravelのHttpクライアントを使ってプロキシを設定する際、以下のようなSSL証明書検証エラーによりリクエストが失敗することがあります:
cURL error 60: SSL certificate problem: self-signed certificate in certificate chain
これは通常、プロキシサーバーが自己署名のSSL証明書を使用している場合に発生します。
プロキシサーバーを信頼していて、ローカルまたは安全な環境でのテストのみを行っている場合は、次のようにSSL検証を無効にできます:
$response = Http::withOptions([
'proxy' => $proxyUrl,
'verify' => false, // disable SSL certificate verification
])->get('https://httpbin.io/ip');
警告: SSL検証を無効にすると、中間者攻撃にさらされることになります。そのため、このオプションは信頼できる環境でのみ使用してください。
一方、プロキシサーバーの証明書ファイル(例: proxy-ca.crt)をお持ちの場合は、以下のようにSSL検証に使用できます:
$response = Http::withOptions([
'proxy' => $proxyUrl,
'verify' => storage_path('certs/proxy-ca.crt'), // Path to the CA bundle
])->get('https://httpbin.io/ip');
proxy-ca.crtファイルが安全でアクセス可能なディレクトリ(例: storage/certs/)に保存されており、Laravelにそれを読み取る権限があることを確認してください。
どちらかの方法を実施することで、プロキシに起因するSSL検証エラーは解消されるはずです。
プロキシローテーション
同じプロキシサーバーを繰り返し使い続けると、ターゲットのウェブサイトはやがてそのプロキシのIPアドレスを検知してブロックする可能性が高くなります。それを避けるために、プロキシサーバーをローテーションさせ、リクエストごとに異なるものを使用できます。
Laravelでプロキシをローテーションする手順は以下の通りです:
- 複数のプロキシURLを含む配列を作成する
- 各リクエストの前にランダムに1つを選択する
- 選択されたプロキシをHTTPクライアントの設定に設定する
以下のコードで実装します:
<?php
namespace AppHttpControllers;
use IlluminateHttpRequest;
use IlluminateHttpJsonResponse;
use IlluminateSupportFacadesHttp;
function getRandomProxyUrl(): string
{
// a list of valid proxy URLs (replace with your proxy URLs)
$proxies = [
'<protocol_1>://<proxy_host_1>:<port_1>',
// ...
'<protocol_n>://<proxy_host_n>:<port_n>',
];
// return a proxy URL randomly picked from the list
return $proxies[array_rand($proxies)];
}
class IPController extends Controller
{
public function getIP(): JsonResponse
{
// the URL of the proxy server
$proxyUrl = getRandomProxyUrl();
// make a GET request to /ip endpoint through the proxy server
$response = Http::withOptions([
'proxy' => $proxyUrl
])->get('https://httpbin.io/ip');
// retrieve the response data
$responseData = $response->json();
// return the response data
return response()->json($responseData);
}
}
上記のスニペットは、プロキシローテーションをシミュレートするためにリストからプロキシをランダムに選択する方法を示しています。このアプローチは機能しますが、いくつかの欠点があります:
- 信頼できるプロキシサーバーのプールを維持する必要があり、多くの場合コストがかかります。
- 効果的なローテーションには、十分な規模のプロキシプールが必要です。プールが大きくないと、同じプロキシが繰り返し使用され、検知やブロックにつながる可能性があります。
これらの制限を回避するために、Bright Dataのローテーションプロキシネットワークを活用することを検討してください。このインフラは、あなたに代わって自動的にIPアドレスをローテーションし、以下へのアクセスを提供します:
- 195か国にわたる1500M以上のIP
- 高い稼働率と99.9%の成功率
次のセクションでは、Bright Dataのローテーションプロキシをlaravelで使用する方法を紹介します。
LaravelでBright Data Proxyを使用する
Bright Dataは世界最大級のプロキシネットワークの1つを運営しており、フォーチュン500企業や50,000+の顧客をサポートしています。彼らのプロキシネットワークには以下が含まれます:
- データセンター・プロキシ – 1,300,000+のデータセンターIP。
- レジデンシャルプロキシ – 195か国以上における400M+のレジデンシャルIP。
- ISPプロキシ – 1,300,000+のISP IP。
以下の手順に従って、Bright Dataのレジデンシャルプロキシをlaravelで使用してください。
まだアカウントをお持ちでない場合は、Bright Dataに登録してください。すでにお持ちの場合は、ログインしてユーザーダッシュボードにアクセスしてください:

ログインしたら、「Get proxy products」ボタンをクリックして進みます:

「Proxies & Scraping Infrastructure」ページにリダイレクトされます:

テーブル内で「Residential」の行を見つけてクリックしてください:

レジデンシャルプロキシのページに移動します:

初めての場合は、ウィザードに従ってニーズに合わせてプロキシサービスを設定してください。さらにサポートが必要な場合は、24時間365日対応のサポートに気軽にお問い合わせください。
「Overview」タブで、プロキシのホスト、ポート、ユーザー名、パスワードを見つけてください:

これらの詳細を使ってプロキシURLを構築します:
$proxyUrl = 'http://<brightdata_proxy_username>:<brightdata_proxy_password>@<brightdata_proxy_host>:<brightdata_proxy_port>';
プレースホルダー(<brightdata_proxy_username>、<brightdata_proxy_password>、<brightdata_proxy_host>、<brightdata_proxy_port>)を実際のプロキシ認証情報に置き換えてください。
「Off」の設定を切り替えてプロキシ製品を有効にし、残りの手順に従ってセットアップを完了してください:

プロキシURLが設定できたら、Httpクライアントを使ってLaravelに統合できます。Laravelでローテーションするbright dataのレジデンシャルプロキシ経由でリクエストを送信するロジックは以下の通りです:
public function getIp()
{
// TODO: replace the placeholders with your Bright Data's proxy info
$proxyUrl = 'http://<brightdata_proxy_username>:<brightdata_proxy_password>@<brightdata_proxy_host>:<brightdata_proxy_port>';
// make a GET request to "/ip" through the proxy
$response = Http::withOptions([
'proxy' => $proxyUrl,
])->get('https://httpbin.org/ip');
// get the response data
$responseData = $response->json();
return response()->json($responseData);
}
上記のスクリプトを実行するたびに、異なる出口IPが表示されます。
Bright Dataの自動ローテーションプロキシを使えば、Laravelでのプロキシローテーションがこれまでになく簡単になります!
[補足] SymfonyのHttpClientプロキシ統合
LaravelのデフォルトhttpクライアントHttpよりもSymfonyのHttpClientコンポーネントを好む場合を想定します。
以下の手順に従って、LaravelでHttpClientにプロキシ統合を実装してください。
まず、Composer経由でSymfonyのHTTPクライアントパッケージをインストールする必要があります:
composer require symfony/http-client
次に、以下のようにSymfonyのHttpClientをプロキシとともに使用できます:
<?php
namespace AppHttpControllers;
use SymfonyContractsHttpClientHttpClientInterface;
use IlluminateHttpJsonResponse;
class IpController extends Controller
{
// where to store the HttpClient instance
private $client;
public function __construct(HttpClientInterface $client)
{
// initialize the HttpClient private instance
$this->client = $client;
}
public function getIp(): JsonResponse
{
// your proxy URL
$proxyUrl = 'http://66.29.154.103:3128'; // replace with your proxy URL
// make a GET request to the "/ip" endpoint through the proxy
$response = $this->client->request('GET', 'https://httpbin.io/ip', [
'proxy' => $proxyUrl,
]);
// parse the response JSON and return it
$responseData = $response->toArray();
return response()->json($responseData);
}
}
この設定により、SymfonyのHttpClientを使ってプロキシ経由でリクエストを送信できるようになります。
まとめ
このプロキシ統合チュートリアルでは、プロキシが重要である理由とlaravelでの使用方法を学びました。LaravelのデフォルトhttpクライアントとsymfonyのHttpClientの両方で、どのように簡単にプロキシを設定できるかを扱いました。
また、無料のプロキシサービスがなぜ信頼性に欠け、リスクすらあるのかも確認しました。安定したパフォーマンス、セキュリティ、拡張性のためには、信頼できるプロキシプロバイダーを選ぶ必要があります。時間と労力を節約し、市場で最高のプロキシプロバイダー、Bright Dataへ直接進みましょう。
アカウントを作成して、今すぐ私たちのプロキシをテストしてみましょう!