Ошибка 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. Настройте мониторинг логов, чтобы быстро реагировать на подобные ошибки.

    Часто задаваемые вопросы