Drupal洪水控制功能无法获取正确客户端IP地址问题求助
问题分析与解决方案
问题原因
请求链路为客户端 → 交换机(149.32.195.197) → 负载均衡(172.17.21.5) → Drupal服务器,因此X-Forwarded-For头呈现为客户端IP, 交换机IP的格式。当前仅将负载均衡IP加入reverse_proxy_addresses可信列表,Drupal/Symfony仅信任来自负载均衡的请求头,但无法识别交换机也是可信代理,导致解析客户端IP时,错误将X-Forwarded-For中最后一个非可信代理的IP(交换机IP)判定为客户端IP。
解决方案
1. 扩展可信代理列表
更新settings.php中的reverse_proxy_addresses,把交换机IP也添加进去:
/* 设置反向代理(负载均衡器+交换机)地址 */ $settings['reverse_proxy_addresses'] = ['172.17.21.5', '149.32.195.197']; // test-bnc4-web1 + 交换机
配置后,Drupal会将交换机和负载均衡都视为可信代理,解析X-Forwarded-For时会自动移除所有可信代理的IP,最终保留最左侧的真实客户端IP。
2. 规范IP获取逻辑
若修改配置后问题仍存在,需检查登录失败日志的IP获取代码,确保使用Drupal标准方式获取客户端IP:
// 正确获取客户端IP的方式 $ip = \Drupal::request()->getClientIp();
避免直接读取$_SERVER['X_FORWARDED_FOR']或$_SERVER['REMOTE_ADDR'],这类值未经过Drupal的反向代理解析处理,无法保证准确性。
3. 验证负载均衡头转发配置
确认负载均衡在转发请求时,正确保留上游的X-Forwarded-For头(即交换机添加的客户端IP),而非覆盖或错误追加自身IP。
内容的提问来源于stack exchange,提问作者user4202824
相关产品推荐
相关产品推荐

