完成本篇 Laravel 代理集成指南后,你将了解:
- 什么是代理,以及它们在 Laravel 中如何工作
- 在何时以及为什么需要代理
- 如何在 Laravel 项目中配置代理
- 如何在 Laravel 中处理代理身份验证、SSL 证书问题以及 IP 轮换
- 如何在 Symfony 的
HttpClient
组件中集成代理
让我们开始吧!
什么是 Laravel 代理?
Laravel 代理在你的 Laravel 后端和外部服务器之间充当中间人。它允许你以编程方式通过代理服务器转发你的服务器流量,从而隐藏你的 IP 地址。
下面是 Laravel 中代理的工作原理:
- Laravel 使用配置了代理的 HTTP 客户端库发送 HTTP 请求。
- 请求经过代理服务器。
- 代理将请求转发给目标服务器。
- 目标服务器将响应发回代理。
- 代理再将响应返回给 Laravel。
因此,目标服务器会看到请求来自该代理的 IP,而不是你的 Laravel 服务器 IP。依靠这种机制,你可以绕过地理限制、提高匿名性并管理请求速率限制。
Laravel 中使用代理的场景
在 Laravel 中使用代理有许多好处,但以下三种场景最为常见:
- 网络爬取:当你在构建网络爬取 API 时使用代理以避免 IP 封禁、速率限制或其他阻拦。可阅读我们关于使用 Laravel 进行网络爬取的教程了解更多。
- 绕过第三方 API 的速率限制:通过轮换代理 IP 来维持在 API 使用配额内,并避免被限流。
- 访问地理位置受限的内容:选择特定区域的代理服务器来访问仅在某些国家或地区提供的服务。
更多示例可参考我们的网络数据和代理使用案例指南。
在 Laravel 中使用代理:分步指南
在本节中,我们将演示如何在 Laravel 中使用默认 HTTP 客户端集成代理。如果你使用 Symfony 的 HttpClient
,请不用担心——我们会在文章后面介绍在该库中集成代理的方式。
注意:Laravel 的 HTTP 客户端是基于 Guzzle 构建的,如果需要,可以查看我们的 Guzzle 代理集成指南。
为了演示集成过程,我们将创建一个 GET
请求的 /api/v1/get-ip
端点:
- 通过配置好的代理,向
https://httpbin.io/ip
发送GET
请求。 - 从响应中获取出口 IP 地址。
- 将该 IP 地址返回给调用此 Laravel 端点的客户端。
若一切配置无误,返回的 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
{
//
}
现在,在 IPController.php
中添加下面的 getIP()
方法:
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 格式返回结果。
别忘了导入这两个类:
use IlluminateHttpJsonResponse;
use IlluminateSupportFacadesHttp;
因为你想让 Laravel 应用提供无状态 API,所以可以使用 install:api
Artisan 命令来启用 API 路由:
php artisan install: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 应用中使用代理,你首先需要一个可用的代理服务器。
虽然有许多网站提供免费代理,但务必提高警惕——维护代理基础设施是有成本的。如果某项服务提供免费代理,你应考虑它是如何支付相关成本的。通常,这可能涉及到可疑做法,例如收集数据或重定向你的流量。
注意:免费代理只能用于测试或学习用途,永远不要在生产环境中使用。
若需要稳定可靠的代理,请选择可信赖的供应商,他们一般会提供免费试用或限制性免费套餐。例如,你可以尝试Bright Data 的免费代理。
典型的代理 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
中集成代理
在 Laravel 中通过 Http
客户端使用代理只需要做很少的配置:
$proxyUrl = 'http://66.29.154.103:3128';
$response = Http::withOptions([
'proxy' => $proxyUrl
])->get('https://httpbin.io/ip');
$responseData = $response->json();
正如所见,你只需通过 withOptions()
方法将代理 URL 作为选项传入即可,这会使用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
替换为当前可用的代理 URL。
注意:如果发起请求时遇到 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');
用一个可用的带身份验证的代理 URL 替换 $proxyUrl
的值即可。
现在,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
),也可以通过以下方式进行验证:
$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 的数组
- 在每次请求前随机选择一个
- 在 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 个国家的 15 亿+ IP 地址
- 住宅、数据中心、ISP 和移动代理
- 高在线率与 99.9% 的成功请求率
下一节将展示如何在 Laravel 中使用 Bright Data 的轮换代理。
在 Laravel 中使用 Bright Data 代理
Bright Data 拥有全球最大的代理网络之一,服务于多家世界 500 强公司及超过 20,000 位客户。其代理网络包括:
- 数据中心代理 – 超过 770,000 个数据中心 IP。
- 住宅代理 – 覆盖 195 多个国家、超过 1.5 亿个住宅 IP。
- ISP 代理 – 超过 700,000 个 ISP IP。
- 移动代理 – 超过 7,000,000 个移动 IP。
按照以下步骤,将 Bright Data 的住宅代理用于 Laravel。
如果你还没有账号,可以注册 Bright Data。已经有账号的话,请登录并进入用户仪表盘:
登录后,点击“Get proxy products”按钮:
系统会跳转到“Proxies & Scraping Infrastructure”页面:
在列表中找到“Residential”一行并点击:
此时将进入住宅代理页面:
如果是第一次使用,可根据向导完成代理服务的配置。如需帮助,可随时咨询 24/7 客服。
在“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”切换到“On”来启用代理产品,并按提示完成剩余配置:
最后,在 Laravel 中使用 Http
客户端将这个自动轮换的 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
中使用代理
如果你更喜欢使用 Symfony 的 HttpClient
而不是 Laravel 内置的 Http
客户端:
可按如下操作在 Laravel 中通过 HttpClient
实现代理集成:
首先,通过 Composer 安装 Symfony HttpClient
:
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。
立即注册账号并免费尝试他们的代理吧!
支持支付宝等多种支付方式