如何解决Drupal9使用负载均衡时出现的Base url配置失效问题
Drupal 9相比Drupal 8强化了反向代理请求的安全校验,你原有配置失效的核心原因是reverse_proxy_addresses的动态赋值逻辑不再被Drupal 9兼容,且缺少协议相关的头配置,可按以下步骤调整:
解决方案
1. 替换动态反向代理地址配置
不要使用array($_SERVER['REMOTE_ADDR'])这种动态获取的方式,Drupal 9要求必须明确指定可信的负载均衡IP/IP段,示例:
// 替换为你实际的负载均衡服务器IP,多个IP可依次添加 $settings['reverse_proxy_addresses'] = [ '10.101.9.23', // 此处替换为你的负载均衡实际IP ];
2. 补充完整反向代理头配置
除了自定义的Host头,还需要补充协议、端口相关的头配置,避免出现HTTP/HTTPS跳转或端口异常问题,完整配置参考:
$settings['reverse_proxy'] = TRUE; $settings['reverse_proxy_addresses'] = ['你的负载均衡实际IP']; $settings['reverse_proxy_host_header'] = 'X-ORIGINAL-HOST'; // 新增协议头配置,对应负载均衡传递的协议头字段 $settings['reverse_proxy_proto_header'] = 'X-Forwarded-Proto'; // 如有非标准端口需求可以补充端口头配置 $settings['reverse_proxy_port_header'] = 'X-Forwarded-Port'; $settings['trusted_host_patterns'] = [ '^d9\.johndoe\.dev$', '^10\.101\.9\.23$', ];
3. 强制固定Base URL(兜底方案)
如果调整代理配置后仍然不生效,可以直接在settings.php中强制覆盖请求的Host、协议参数,完全替代已弃用的$base_url配置:
// 按你实际的站点信息修改以下参数 $site_domain = 'd9.johndoe.dev'; $site_protocol = 'https'; // 站点实际协议,填http或https $site_port = ''; // 非80/443端口时填写,比如':8080' // 强制覆盖全局请求参数 $_SERVER['HTTP_HOST'] = $site_domain . $site_port; $_SERVER['HTTPS'] = $site_protocol === 'https' ? 'on' : 'off'; $_SERVER['SERVER_PORT'] = $site_protocol === 'https' ? 443 : 80;
4. 配置校验
修改完成后清空Drupal全站缓存,访问站点检查页面内链接的域名是否已经替换为预设的base URL,同时确认后台状态报告无反向代理相关的告警即可。
内容的提问来源于stack exchange,提问作者John Aroza
相关产品推荐
相关产品推荐

