$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();
}
我相信我在升级 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();
}