fideloper / proxy
为 Laravel 设置可信代理
Requires
- php: >=5.4.0
- illuminate/contracts: ^5.0|^6.0|^7.0|^8.0|^9.0
Requires (Dev)
- illuminate/http: ^5.0|^6.0|^7.0|^8.0|^9.0
- mockery/mockery: ^1.0
- phpunit/phpunit: ^8.5.8|^9.3.3
README
设置可信代理可以在 Laravel 后面使用负载均衡器或缓存等反向代理时,正确生成 URL、重定向、处理会话和记录。
安装
Laravel 5.5+ 内置此包。如果您使用的是 Laravel 5.5 或更高版本,您无需单独将此包添加到项目中。
- Laravel 5.5 文档 (
fideloper/proxy:~3.3
) - Laravel 5.6 文档 (
fideloper/proxy:^4.0
) - Laravel 5.7 文档 (
fideloper/proxy:^4.0
) - Laravel 5.8 文档 (
fideloper/proxy:^4.0
) - Laravel 6.x 文档 (
fideloper/proxy:^4.0
) - Laravel 7.x 文档 (
fideloper/proxy:^4.2
) - Laravel 8.x 文档 (
fideloper/proxy:^4.3
) - Laravel 9.x 文档 (不要使用此包。 解释在此, 升级文档在此)
Laravel 5.0 - 5.4
要安装 Trusted Proxy,请使用
composer require fideloper/proxy:^3.3
Laravel 4
composer require fideloper/proxy:^2.0
设置
有关在 Laravel 5.5+ 中使用 Trusted Proxy 的说明,请参阅上面的文档。对于 Laravel 4.0 - 5.4,请参阅 Wiki。
这是做什么的?
设置可信代理可以在 Laravel 后面使用反向代理时,正确生成 URL、重定向、处理会话和记录。
如果您使用的 Web 服务器位于负载均衡器(Nginx、HAProxy、Envoy、ELB/ALB 等)或 HTTP 缓存(CloudFlare、Squid、Varnish 等)之后,这将非常有用。
它是如何工作的?
位于反向代理后面的应用程序通常读取一些 HTTP 标头,例如 X-Forwarded
、X-Forwarded-For
、X-Forwarded-Proto
(等等),以了解发出 HTTP 请求的真实终端客户端。
如果没有设置这些标头,则应用程序代码会认为每个传入的 HTTP 请求都是从代理发出的。
Laravel(技术上讲是 Symfony HTTP 基类)有一个“可信代理”的概念,其中那些 X-Forwarded
标头只有在请求的源 IP 地址已知时才会使用。换句话说,只有当代理被信任时,它才会信任那些标头。
此包创建了一个更简单的接口。您可以设置代理的 IP 地址(应用程序可以看到的,因此可能是私有网络 IP 地址),并且当包含那些标头的 HTTP 请求来自可信代理时,Symfony HTTP 类将知道使用 X-Forwarded
标头。
为什么这很重要?
一个非常常见的负载均衡方法是将 https://
请求发送到负载均衡器,但将 http://
请求发送到负载均衡器后面的应用程序服务器。
例如,您可以在浏览器中发送请求到 https://example.org
。负载均衡器随后可能会将请求发送到应用程序服务器,地址为 http://192.168.1.23
。
如果该服务器返回重定向或生成资产 URL 呢?用户的浏览器会接收到包含 http://192.168.1.23
的重定向或 HTML,这显然是错误的。
发生的情况是,应用程序认为其主机名为 192.168.1.23
,协议为 http://
。它不知道最终客户端使用了 https://example.org
进行其 Web 请求。
因此,应用程序需要知道读取 X-Forwarded
头部以获取正确的请求详情(协议 https://
,主机 example.org
)。
Laravel/Symfony 会自动读取这些头部,但前提是已将可信代理配置设置为“信任”负载均衡器/反向代理。
注意:我们中许多人使用托管负载均衡器/代理,如 AWS ELB/ALB 等。我们不知道这些反向代理的 IP 地址,因此在这种情况下需要信任 所有 代理。
这里的权衡是运行安全风险,允许人们可能伪造
X-Forwarded
头部。
按服务分类的 IP 地址
这个维基页面 列出了一些流行的服务及其服务器的 IP 地址(如有)。欢迎更新或建议!