$base_url 升级 Drupal 后表单出现问题

$base_url problems in forms after upgrading Drupal

我相信我在升级 Drupal (7.33 -> 7.39) 时遵循了说明,但设法破坏了它。

设置:Drupal 站点位于反向代理后面:

<Location /app>
  ProxyPass http://back.example.com/drupal
  ProxyPassReverse http://back.example.com/drupal
  ProxyPassReverseCookiePath /drupal /app
</Location>

而在 sites/default/settings.php 中,有这个位:

$conf['reverse_proxy_header'] = 'HTTP_X_FORWARDED_FOR';
if (!empty($_SERVER[$conf['reverse_proxy_header']])) {
  $base_url = 'http://front.example.com/app';
}

问题:虽然某些表单似乎可以生成正确的 action 属性 (<form action="/app/..." ...>),但大多数(尤其是管理区域中的所有内容)都忽略了 $base_url,生成<form action="/drupal/..." ...>,所以明显提交失败

我查看了源代码,但一开始我无法弄清楚它是如何工作的,因为据我所知,action 是从 drupal_build_form 生成的,它从 element_info('form') 读取操作数据,由 system_element_info 填充,后者又调用 request_uri() - request_uri() 中没有关于 [=16= 的任何内容].

我试图用 drush 清除缓存以防万一我在数据库中遗漏了一些东西,但它没有帮助。

编辑:似乎大多数链接都在调用 url($path) 函数,它做了正确的事情。但是它没有被表单的 action 属性调用,除了从插件呈现的表单(并且它似乎没有使用 element_info,而是调用 url 到构造它的 action).

EDIT2:如果不清楚,$base_url 有正确的值;它只是没有得到应用(我看不出它会应用到哪里)。

问题确实出在 system_element_info 调用 request_uri 中,它没有处理 $base_url...

但在 drupal 中,您始终可以更改内容:

function yourmodule_element_info_alter(&$type) {
  global $base_url;

  // Use $base_url for form action
  $type['form']['#action'] = $base_url . request_path();
}