Советы PHP-разработчика

Блог содержащий короткие заметки касающиеся программирования для web.

Пустая страница админки в ModX после переноса на хостинг

Пустая страница админки в ModX после переноса на хостинг

Сегодня речь пойдет об ошибке ModX Revolution, которая возникает при переносе сайта на некоторые хостинги. Она заключается в том, что на экран выводится только меню админки, а боковое меню и контентная часть страницы остаются пустыми. При возникновении данной проблемы в файл с логами path/to/webroot/core/cache/logs/error.log ничего не попадает, но в консоле web разработчика в браузере можно обнаружить следующее:

Failed to load resource: the server responded with a status of 400 (Bad Request)
http://example.com/manager/min/index.php?f=/manager/assets/modext/cor…idgets/core/modx.panel.js,/manager/assets/modext/widgets/core/modx.tabs.js Failed to load resource: the server responded with a status of 400 (Bad Request)
http://example.com/manager/min/index.php?f=/manager/assets/modext/wid…/assets/modext/core/modx.layout.js,/manager/templates/default/js/layout.js Failed to load resource: the server responded with a status of 400 (Bad Request)
http://example.com/manager/min/index.php?f=/manager/assets/components…anel.system.settings.js,/manager/assets/modext/sections/system/settings.js Failed to load resource: the server responded with a status of 400 (Bad Request)
ext-all.js:21 Uncaught TypeError: b[(d.xtype || e)] is not a function
example.com/:35 Uncaught TypeError: MODx.SearchBar is not a function

Ошибка возникает из-за невозможности осуществить минификацию js скриптов и css стилей.

Первый вариант решения данной проблемы - это отключение минификации css и js. Изменение данных параметров производится через "настройки системы" админки ModX Revo в разделе "панель управления", то так как админка не работает, то придется править данные в БД. Для этого необходимо открыть таблицу system_settings и установить значения compress_css и compress_js в "0". Это можно проделать следующим запросом (только не забудьте дописать префикс к названию таблицы, если он у вас установлен):
UPDATE `system_settings` SET `value` = '0' WHERE `key` IN ('compress_css', 'compress_js');

После этого очищаем папку с кэшем настроек path/to/webroot/core/cache/system_settings. Обновляем страницу админки и радуемся, что все вернулось на место.

Второй путь решения - переустановить ModX поверх ваших данных. Этот способ очень популярен. Для этого необходимо скопировать папку setup из дистрибутива ModX вашей версии и произвести частичную установку. Этот метод я также не рекомендую, т.к. надо разобраться в причинах.

Третий вариант решения (если у вас установлен Suhosin патч для PHP). В скрипте минификации уже устанавливается настройки suhosin.get.max_value_length в значение 4096, но если ваш php запрещает менять значение этой настройки из скрипта, то необходимо установить ее через .htaccess (если у вас Apache) или через файл конфигураций suhosin.ini. При необходимости перезагружаем web сервер и проверяем админку. Если проблема не решилась, то читаем дальше.

Вариант №4 (если установлен eAccelerator). Иногда минификация скриптов ModX работает не совсем корректно с данным акселератором. Можно попробовать отключить его для скрипта. Для этого необходимо установить значение eaccelerator.enable в 0 через webroot/manager/min/.htaccess или php_ini в файле /path/to/webroot/manager/min/index.php.

Пятый вариант решения. Иногда проблема кроется в неправильном DOCUMENT_ROOT (например, некоторые хостинги возвращают некорректное значение для поддомена). В данном случае его необходимо заменить для скрипта минификации. Для этого открываем файл path/to/webroot/manager/min/index.php и первой строкой указываем путь до корня сайта. Это можно сделать несколькими способами:

// Жестко задаем путь руками
$_SERVER['DOCUMENT_ROOT'] = '/path/to/webroot';
// Отдаем всю работу php, который сам строит правильный путь (данный вариан работает только если вы используете стандартную вложеность для админки)
$_SERVER['DOCUMENT_ROOT'] = realpath(dirname(__FILE__) . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . '..'); 

На этом все.

  • 2015-08-18 18:00:51