phecho / proxy
为 Laravel 设置信任的代理
Requires
- php: >=5.4.0
- illuminate/contracts: ~5.0
Requires (Dev)
- illuminate/http: ~5.0
- mockery/mockery: ~0.9.3
This package is not auto-updated.
Last update: 2024-09-18 18:18:28 UTC
README
针对 Laravel 5 更新。
您仍然可以使用此软件包的 Laravel 4 版本。请查看此存储库的最新 v2 标签,它与 Laravel 4 版本兼容。
Laravel 5 的 Middleware 系统更加优雅,此软件包现在利用了这一优势。
新特性包括
- 信任代理现在设置为 HTTP Middleware,这比之前的 ServiceProvider 更具逻辑性。如果您不确定这是什么意思,请记住“Just Trust Fideloper™”。
- 您现在可以设置信任的头部名称。这对于不使用常规
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 软件包的安装
- 安装软件包
- 添加服务提供商
- 发布配置文件
- 添加中间件
- 配置您的信任代理
安装软件包
此软件包位于 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
作为信任代理。
这有什么意义?
如果您的网站位于负载均衡器等代理之后,您的Web应用程序可能存在以下问题
- 重定向和PHP生成的URL在网页地址、协议和/或端口号方面可能不准确。
- 可能不会为每个用户创建唯一的会话,导致可能访问错误的账户,或者用户无法登录。
- 日志或其他数据收集过程的数据可能看起来来自一个位置(代理本身),让您无法区分来自单个客户端的流量/操作。
我们可以通过监听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地址(如有)。欢迎更新或建议!