Ошибка MODX: пустой URL и невалидный integer в makeUrl()
Если ваш сайт на MODX перестал открываться, а в логах появляются ошибки Attempted to redirect to an empty URL и is not a valid integer and may not be passed to makeUrl(), это указывает на проблемы с генерацией ссылок. Разберём причины и пути решения.
Что означают эти ошибки?
Первая ошибка (Attempted to redirect to an empty URL) возникает, когда система пытается перенаправить пользователя на пустой адрес. Вторая (is not a valid integer) появляется, если в метод makeUrl() передаётся не число, а пустая строка или другой невалидный тип данных. Обычно эти ошибки связаны с некорректной работой с ресурсами, контекстами или плагинами.
Основные причины
- Повреждённый ресурс или контекст: если ID ресурса или контекста стал невалидным (например, удалён или перемещён), MODX не может сгенерировать URL.
- Ошибки в шаблонах или сниппетах: неправильная передача ID в
makeUrl()(например,[[*id]]вместо[[*id:default=0]]). - Конфликт плагинов: некоторые плагины (например, для редиректов или SEO) могут перехватывать пустые значения и вызывать ошибку.
- Проблемы с кэшем: устаревший кэш может хранить неверные ссылки, что приводит к циклическим редиректам.
Как диагностировать проблему
Шаг 1: Проверьте логи
Откройте полный лог ошибок (не только последние записи). Ищите предшествующие ошибки, которые могли вызвать пустой URL - например, Undefined index или Call to a member function on null.
Шаг 2: Включите режим отладки
В файле config.core.php установите $modx->setLogTarget('HTML'); и $modx->setLogLevel(modX::LOG_LEVEL_DEBUG);. Это покажет все вызовы makeUrl() с переданными параметрами.
Шаг 3: Проверьте контексты
Перейдите в системные настройки → Контексты. Убедитесь, что у всех контекстов (web, mgr и др.) корректно указан базовый URL. Если какой-то контекст удалён, но на него ссылаются ресурсы - возникнет ошибка.
Пошаговое решение
- Очистите кэш: удалите все файлы из папки
core/cache/(кроме.gitkeep). - Проверьте ресурсы с ID=0: в таблице
modResourceне должно быть записей сid=0. Если есть - удалите или исправьте. - Отключите плагины поочерёдно: временно деактивируйте все плагины, особенно те, что связаны с редиректами (например,
RedirectorилиSEO Pro). Если сайт заработает - проблема в одном из них. - Проверьте вызовы makeUrl(): в шаблонах и сниппетах замените
[[~[[*id]]]]на[[~[[*id:default=`0`]]]]или используйте[[~[[*id:is=``?then=`1`:else=`[[*id]]`]]]].
Профилактика
Регулярно делайте резервное копирование базы данных и файлов сайта. Используйте makeUrl() только с проверкой на валидность ID. Настройте мониторинг логов, чтобы быстро реагировать на подобные ошибки.