如何在 Laravel 中使用代理:2025 教程

掌握在 Laravel 中使用代理的技巧,从简单配置到身份验证和 IP 轮换,确保网络爬取不中断并能访问地理位置受限的内容。
1 分钟阅读
Laravel 代理

完成本篇 Laravel 代理集成指南后,你将了解:

  • 什么是代理,以及它们在 Laravel 中如何工作
  • 在何时以及为什么需要代理
  • 如何在 Laravel 项目中配置代理
  • 如何在 Laravel 中处理代理身份验证、SSL 证书问题以及 IP 轮换
  • 如何在 Symfony 的 HttpClient 组件中集成代理

让我们开始吧!

什么是 Laravel 代理?

Laravel 代理在你的 Laravel 后端和外部服务器之间充当中间人。它允许你以编程方式通过代理服务器转发你的服务器流量,从而隐藏你的 IP 地址。

下面是 Laravel 中代理的工作原理:

  1. Laravel 使用配置了代理的 HTTP 客户端库发送 HTTP 请求。
  2. 请求经过代理服务器。
  3. 代理将请求转发给目标服务器。
  4. 目标服务器将响应发回代理。
  5. 代理再将响应返回给 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 端点:

  1. 通过配置好的代理,向 https://httpbin.io/ip 发送 GET 请求。
  2. 从响应中获取出口 IP 地址。
  3. 将该 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 项目结构

太好了!你现在已经成功创建了一个 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 表示连接代理服务器所需的协议(如 httphttpssocks5 等)
  • 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>

其中 usernamepassword 是你的认证凭证。

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 中轮换代理的大致步骤如下:

  1. 创建一个包含多个代理 URL 的数组
  2. 在每次请求前随机选择一个
  3. 在 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);
    }
}

上述示例通过随机从代理列表中挑选一个来模拟代理轮换。虽然此方法可行,但存在以下不足:

  1. 你需要自己维护一个可用且稳定的代理池,这通常是要花钱的。
  2. 如果代理池规模不够大,少量代理会被频繁复用,仍可能被侦测与封禁。

要避免这些限制,可以考虑使用 Bright Data 的轮换代理网络。该网络会自动帮你轮换 IP,并提供:

  • 遍布 195 个国家的 15 亿+ IP 地址
  • 住宅、数据中心、ISP 和移动代理
  • 高在线率与 99.9% 的成功请求率

下一节将展示如何在 Laravel 中使用 Bright Data 的轮换代理。

在 Laravel 中使用 Bright Data 代理

Bright Data 拥有全球最大的代理网络之一,服务于多家世界 500 强公司及超过 20,000 位客户。其代理网络包括:

按照以下步骤,将 Bright Data 的住宅代理用于 Laravel。

如果你还没有账号,可以注册 Bright Data。已经有账号的话,请登录并进入用户仪表盘:

Bright Data 仪表盘

登录后,点击“Get proxy products”按钮:

点击“Get proxy products”按钮

系统会跳转到“Proxies & Scraping Infrastructure”页面:

“Proxies & Scraping Infrastructure”页面

在列表中找到“Residential”一行并点击:

点击“residential”行

此时将进入住宅代理页面:

“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。

立即注册账号并免费尝试他们的代理吧!

支持支付宝等多种支付方式