2015-09-08 6 views
0

Полагаю, что я выполнил инструкции при обновлении 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() около $base_url.

Я попытался очистить кеши с drush на всякий случай, когда я что-то упустил в базе данных, и это не помогло.

EDIT: Кажется, что большинство ссылок вызывает функцию url($path), что делает правильную вещь. Но он не вызывается для атрибута формы action, за исключением формы, которая визуализируется из плагина (и который, похоже, не использует element_info, но вызывает url для построения своего action).

EDIT2: Если было не ясно, $base_url имеет правильное значение; он просто не применяется (и я не вижу, где он будет применяться).

ответ

1

Проблема действительно в system_element_info вызывающих request_uri, не заботясь о $ base_url ...

Но, как всегда в Друпала вы можете изменить вещи:

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

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

Спасибо, это было пропатчить вопрос, так что, по крайней мере, сайт можно использовать. Он по-прежнему ведет себя странно - например, формы имеют «target =» _ new », но это гораздо менее важно. Тем не менее, большой вопрос, который у меня есть, - как, черт возьми, он работал в первую очередь, до обновления?!? (Я поддерживал старый код, и это эквивалентно. Я вернул его на Apache, и он не работает.) В любом случае, я буду принимать этот ответ в предварительном порядке, если кто-то не сможет объяснить причину этого. – Amadan

Смежные вопросы