负载均衡器与Cloudflare下获取访客真实IP:Apache与Laravel适配问题
解决Laravel在Cloudflare+IONOS负载均衡环境下的真实IP获取问题
问题根源
你的环境代理链是「真实访客 → Cloudflare → IONOS负载均衡 → Apache服务器」。配置Apache的remoteip_module后,X-Forwarded-For被重写为真实访客IP, 10.7.224.225(负载均衡IP)。而Laravel默认当$proxies = '*'时,会将X-Forwarded-For列表的最后一个IP判定为客户端IP(因为它认为最后一个是最近的代理节点),这就导致Laravel错误地返回了负载均衡IP。
解决方案
1. 修正TrustProxies中间件配置
打开app/Http/Middleware/TrustProxies.php,替换为以下配置:
<?php namespace App\Http\Middleware; use Illuminate\Http\Middleware\TrustProxies as Middleware; use Illuminate\Http\Request; class TrustProxies extends Middleware { /** * 可信代理IP/IP段 * 包含Cloudflare所有公网IP段 + IONOS负载均衡内部IP */ protected $proxies = [ // Cloudflare IPv4段 '103.21.244.0/22', '103.22.200.0/22', '103.31.4.0/22', '104.16.0.0/13', '104.24.0.0/14', '108.162.192.0/18', '131.0.72.0/22', '141.101.64.0/18', '162.158.0.0/15', '172.64.0.0/13', '173.245.48.0/20', '188.114.96.0/20', '190.93.240.0/20', '197.234.240.0/22', '198.41.128.0/17', // Cloudflare IPv6段(按需启用) '2400:cb00::/32', '2606:4700::/32', '2803:f800::/32', '2405:b500::/32', '2405:8100::/32', '2a06:98c0::/29', '2c0f:f248::/32', // IONOS负载均衡内部IP '10.7.224.225', ]; /** * 指定Laravel优先读取的代理头 * 同时支持CF-Connecting-IP和X-Forwarded-For */ protected $headers = Request::HEADER_X_FORWARDED_FOR | Request::HEADER_CF_CONNECTING_IP; }
- 用具体的可信代理IP替换
*,既避免安全风险,又让Laravel正确识别代理链顺序,自动取X-Forwarded-For列表的第一个IP作为真实访客IP。 - 配置
$headers后,Laravel会优先从可信代理提供的CF-Connecting-IP或X-Forwarded-For头中获取真实IP。
2. 规范Apache的RemoteIP配置(可选但推荐)
在Plesk的Apache额外配置中添加以下内容:
RemoteIPTrustedProxy 10.7.224.225 RemoteIPHeader CF-Connecting-IP
RemoteIPTrustedProxy指定仅信任IONOS负载均衡的IP,避免恶意客户端伪造CF-Connecting-IP头。- 确保Apache只处理来自可信负载均衡的代理头,进一步提升安全性。
3. 验证配置
- 在Laravel代码中用
request()->ip()测试返回值,确认是真实访客IP。 - 检查Apache访问日志,确认日志记录的IP正确。
- 打印
request()->headers->all(),查看X-Forwarded-For和CF-Connecting-IP的内容是否符合预期。
内容的提问来源于stack exchange,提问作者PeteB
相关产品推荐
相关产品推荐

