phecho/proxy

为 Laravel 设置信任的代理

3.0.1 2015-12-22 10:04 UTC

This package is not auto-updated.

Last update: 2024-09-18 18:18:28 UTC


README

Build Status

Total Downloads

针对 Laravel 5 更新。

您仍然可以使用此软件包的 Laravel 4 版本。请查看此存储库的最新 v2 标签,它与 Laravel 4 版本兼容。

Laravel 5 的 Middleware 系统更加优雅,此软件包现在利用了这一优势。

新特性包括

  1. 信任代理现在设置为 HTTP Middleware,这比之前的 ServiceProvider 更具逻辑性。如果您不确定这是什么意思,请记住“Just Trust Fideloper™”。
  2. 您现在可以设置信任的头部名称。这对于不使用常规 X-Forwarded-* 头部的代理很有用。请参阅 问题 #9问题 #7 以获取示例和讨论。

要在 Laravel 5 中使用此软件包,请在您的 Laravel 5 项目目录中运行以下命令

composer require fideloper/proxy:~3.0

或者当然,您可以直接编辑您的 composer.json 文件

{
    "require": {
        "fideloper/proxy": "~3.0"
    }
}

WAT

设置信任代理允许在代理后正确生成 URL、进行重定向、处理会话和记录 Laravel 中的日志。

如果您的 Web 服务器位于负载均衡器、HTTP 缓存或其他中间代理(反向代理)之后,这将很有用。

TL;DR 设置

安装信任代理

$ composer require fideloper/proxy:~3.0

添加服务提供商

'providers' => array(
    # other providers omitted
    'Fideloper\Proxy\TrustedProxyServiceProvider',
);

将软件包配置文件发布到 config/trustedproxy.php

$ php artisan vendor:publish

然后在文件 app/Http/Kernel.php 中注册 HTTP 中间件

    protected $middleware = [
        // Illuminate middlewares omitted for brevity

        'Fideloper\Proxy\TrustProxies',

然后根据需要编辑已发布的配置文件 config/trustedproxy.php

以下将信任 IP 地址为 192.168.10.10 的代理,例如负载均衡器或网页缓存

<?php

return [
    'proxies' => [
        '192.168.10.10',
    ],

    // These are defaults already set in the config:
    'headers' => [
        \Illuminate\Http\Request::HEADER_CLIENT_IP    => 'X_FORWARDED_FOR',
        \Illuminate\Http\Request::HEADER_CLIENT_HOST  => 'X_FORWARDED_HOST',
        \Illuminate\Http\Request::HEADER_CLIENT_PROTO => 'X_FORWARDED_PROTO',
        \Illuminate\Http\Request::HEADER_CLIENT_PORT  => 'X_FORWARDED_PORT',
    ]
];

这究竟是什么?

如果您的网站位于负载均衡器、网关缓存或其他“反向代理”之后,每个 Web 请求都可能看起来总是来自该代理,而不是客户端实际上在您的网站上发起请求。

为了解决这个问题,此软件包允许您利用 Symfony 对代理的了解。以下是对“信任代理”主题的更多解释。

稍长的安装说明

安装类似于 Laravel 5 软件包的安装

  1. 安装软件包
  2. 添加服务提供商
  3. 发布配置文件
  4. 添加中间件
  5. 配置您的信任代理

安装软件包

此软件包位于 Packagist 中,因此可以通过 Composer 轻易地安装

方法一

$ composer require fideloper/proxy:~3.0

方法二

{
    "require": {
        "fideloper/proxy": "~3.0"
    }
}

添加后,运行 $ composer update 下载文件。

如果您想开发此软件包,您将需要 dev 依赖项,您可以通过在 composer require 命令中添加 --dev 标志来获取这些依赖项。

添加服务提供商

安装的下一步是添加服务提供商。

编辑 config/app.php 并添加提供的 Service Provider

'providers' => array(
    # other providers omitted
    Fideloper\Proxy\TrustedProxyServiceProvider,
);

发布配置文件

此软件包期望 trustedproxy.php 配置文件位于 /config/trustedproxy.php。您可以通过使用新的 Laravel 5 artisan 命令来复制软件包配置文件来完成此操作

```bash` $ php artisan vendor:publish


Once that's finished, there will be a new configuration file to edit at `config/trustedproxy.php`.

### Register the middleware

Edit `app/Http/Kernel.php` and add the provided Middleware:

```php
    protected $middleware = [
        // Illuminate middlewares omitted for brevity

        'Fideloper\Proxy\TrustProxies',

配置信任代理

编辑新发布的 config/trustedproxy.php

<?php

return [

    /*
     * Set trusted proxy IP addresses.
     *
     * Both IPv4 and IPv6 addresses are
     * supported, along with CIDR notation.
     *
     * The "*" character is syntactic sugar
     * within TrustedProxy to trust any proxy;
     * a requirement when you cannot know the address
     * of your proxy (e.g. if using Rackspace balancers).
     */
    'proxies' => [
        '192.168.1.10',
    ],

    /*
     * Or, to trust all proxies, uncomment this:
     */
     # 'proxies' => '*',

    /*
     * Default Header Names
     *
     * Change these if the proxy does
     * not send the default header names.
     *
     * Note that headers such as X-Forwarded-For
     * are transformed to HTTP_X_FORWARDED_FOR format.
     *
     * The following are Symfony defaults, found in
     * \Symfony\Component\HttpFoundation\Request::$trustedHeaders
     */
    'headers' => [
        \Illuminate\Http\Request::HEADER_CLIENT_IP    => 'X_FORWARDED_FOR',
        \Illuminate\Http\Request::HEADER_CLIENT_HOST  => 'X_FORWARDED_HOST',
        \Illuminate\Http\Request::HEADER_CLIENT_PROTO => 'X_FORWARDED_PROTO',
        \Illuminate\Http\Request::HEADER_CLIENT_PORT  => 'X_FORWARDED_PORT',
    ]
];

在上面的示例中,我们假设我们有一个位于 192.168.1.10 的负载均衡器或其他代理。

注意:如果您使用Rackspace、Amazon AWS或其他提供负载均衡器的PaaS "云"服务,负载均衡器的IP地址可能未知。这意味着每个IP地址都需要被信任。

在这种情况下,您可以将'proxies'变量设置为'*'

<?php

return [

     'proxies' => '*',

];

使用*将告诉Laravel信任所有IP地址作为代理。

修改X-Forwarded-*报头名称

默认情况下,底层的Symfony Request类期望从代理发送以下报头名称

  • X-Forwarded-For
  • X-Forwarded-Host
  • X-Forwarded-Proto
  • X-Forwarded-Port

一些代理可能会发送稍微不同的报头。在这些情况下,您可以通过告诉Symfony Request类这些报头的名称来解决问题。

例如,HAProxy可能会发送一个X-Forwarded-Scheme报头而不是X-Forwarded-Proto。我们可以通过以下配置调整Laravel(实际上,是Symfony HTTP Request类)来解决这个问题

<?php

return [

    'headers' => [
        \Illuminate\Http\Request::HEADER_CLIENT_PROTO => 'X_FORWARDED_SCHEME',
    ]

];

这样,我们的应用程序现在就会知道如何处理X-Forwarded-Scheme报头。

不用担心默认值是IN_THIS_FORMAT,而我们将报头设置为In-This-Format。所有这些都在底层进行了规范化。Symfony的HTTP类非常强大 💥。

你知道吗,CIDR吗,兄弟?

Symfony还会接受用于配置信任代理的CIDR 表示法。这意味着您可以设置地址范围,例如192.168.12.0/23作为信任代理。

请参阅这里这里,以了解如何在Symfony中实现这一点。

这有什么意义?

如果您的网站位于负载均衡器等代理之后,您的Web应用程序可能存在以下问题

  1. 重定向和PHP生成的URL在网页地址、协议和/或端口号方面可能不准确。
  2. 可能不会为每个用户创建唯一的会话,导致可能访问错误的账户,或者用户无法登录。
  3. 日志或其他数据收集过程的数据可能看起来来自一个位置(代理本身),让您无法区分来自单个客户端的流量/操作。

我们可以通过监听X-Forwarded-*报头来解决这个问题。这些报头通常由代理添加,以便您的Web应用程序了解请求发起者的详细信息。

常见的报头包括

  • X-Forwarded-For - 客户端的IP地址
  • X-Forwarded-Host - 在浏览器中访问网站时使用的域名
  • X-Forwarded-Proto - 客户端使用的模式/协议(http/https)
  • X-Forwarded-Port - 客户端使用的端口号(通常是80或443)

Laravel使用Symfony来处理请求和响应。这些类有处理代理的能力。然而,出于安全原因,它们必须在尝试读取X-Forwarded-*报头之前被告知哪些代理要"信任"。

Laravel没有默认的配置选项来"信任"代理。此包只是提供了一个。

Symfony和Laravel中的代理

为了使Laravel能够检查转发的IP地址、模式/协议和端口,我们需要告诉Laravel我们的代理的IP地址,这样应用程序就知道要"信任"它们。如果它发现接收到的IP地址是信任的IP地址,它将查找X-Forwarded-*报头。否则,它将忽略。

如果我们没有告诉Laravel我们的代理(或代理)的IP地址,出于安全原因,它会忽略它。

按服务分配IP地址

此维基页面列出了流行的服务及其服务器的IP地址(如有)。欢迎更新或建议!