Почему страница в Yii2 отдаёт 404 и где искать причину

Ошибка 404 в Yii2 не всегда означает, что страницы действительно нет. Иногда контроллер существует, action написан правильно, но запрос не доходит до приложения из-за nginx. Иногда мешает правило urlManager. Иногда проблема в регистре букв, модуле, параметрах или старом кэше маршрутов.

Лучше не начинать с хаотичной правки rules. Сначала нужно понять, где именно теряется запрос: на уровне веб-сервера, приложения, контроллера или конкретного action.

Проверить сам URL

Сначала стоит убрать случайные причины: лишний слеш, неправильный домен, старую ссылку, опечатку в slug или параметрах. Если 404 появляется только у одного URL, нужно сравнить его с рабочими похожими страницами.

curl -I https://example.ru/blog/test-page
curl -I https://example.ru/index.php?r=blog/view&slug=test-page

Если вариант с index.php и параметром r работает, а красивый URL нет, проблема почти точно в pretty URL, правилах urlManager или конфиге веб-сервера.

urlManager и pretty URL

В Yii2 красивые URL обычно включаются через urlManager. Минимальная настройка выглядит так:

'urlManager' => [
    'enablePrettyUrl' => true,
    'showScriptName' => false,
    'rules' => [
        'blog/<slug:[a-z0-9\-]+>' => 'blog/view',
    ],
],

Если showScriptName выключен, сервер должен отправлять запросы в index.php. Без этого Yii2 не получит маршрут и будет 404 от nginx или Apache.

nginx: try_files

Для nginx важно правильно настроить try_files. Частая ошибка — сервер ищет физический файл и не передаёт запрос в index.php.

location / {
    try_files $uri $uri/ /index.php?$args;
}

Если проект лежит не в корне домена, а в подпапке, настройка может отличаться. Важно проверить document root: он должен смотреть в web, а не в корень проекта.

root /var/www/site.ru/web;
index index.php;

Контроллер и action

Если запрос до Yii2 доходит, но приложение отдаёт 404, нужно проверить контроллер и action. Для маршрута blog/view Yii2 ищет BlogController и метод actionView.

class BlogController extends Controller
{
    public function actionView($slug)
    {
        // ...
    }
}

Если action требует обязательный параметр, а правило URL его не передаёт, страница может падать с ошибкой. Иногда это выглядит как 404, особенно если исключение обработано общим обработчиком.

Правила URL и порядок

Порядок rules имеет значение. Более общее правило может перехватить URL раньше конкретного. Например, правило для страниц может забрать адрес блога.

'rules' => [
    'blog/<slug:[a-z0-9\-]+>' => 'blog/view',
    '<slug:[a-z0-9\-]+>' => 'page/view',
],

Если поменять порядок, blog/test может попасть не туда. Поэтому конкретные правила обычно ставят выше общих.

Модули

Если контроллер находится в модуле, маршрут будет другим. Например, admin/blog/index требует подключенного модуля admin.

'modules' => [
    'admin' => [
        'class' => 'app\modules\admin\Module',
    ],
],

Для модулей нужно проверить namespace контроллеров и фактическое расположение файлов. Ошибка в namespace иногда проявляется как невозможность найти маршрут.

Страницы из базы

Для страниц, которые берутся из базы по slug, 404 часто связан не с роутингом, а с данными. Страница может быть снята с публикации, иметь другой slug или дату публикации в будущем.

SELECT id, title, slug, status
FROM blog_posts
WHERE slug = 'test-page';

В коде нужно аккуратно отделять “маршрут не найден” от “запись не найдена”. Это разные причины, хотя для пользователя обе выглядят как 404.

Логи

Если причина не видна, стоит посмотреть лог приложения и веб-сервера. В Yii2 часто есть запись Route not found или NotFoundHttpException.

tail -n 100 runtime/logs/app.log
tail -n 100 /var/log/nginx/error.log

Короткий чек-лист

  1. Проверить URL без красивого маршрута через index.php?r=.
  2. Проверить enablePrettyUrl и showScriptName.
  3. Проверить nginx try_files и document root.
  4. Проверить контроллер, action и параметры.
  5. Проверить порядок rules.
  6. Проверить подключение модулей.
  7. Проверить запись в базе, если страница динамическая.
  8. Посмотреть app.log и error.log.

404 в Yii2 лучше разбирать как цепочку. Сначала веб-сервер, потом urlManager, потом контроллер, потом данные. Такой порядок быстрее, чем править все правила маршрутизации подряд и надеяться, что одно из них сработает.

Комментарии (0)

Пока нет комментариев. Будьте первым!