Почему страница в 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
Короткий чек-лист
- Проверить URL без красивого маршрута через index.php?r=.
- Проверить enablePrettyUrl и showScriptName.
- Проверить nginx try_files и document root.
- Проверить контроллер, action и параметры.
- Проверить порядок rules.
- Проверить подключение модулей.
- Проверить запись в базе, если страница динамическая.
- Посмотреть app.log и error.log.
404 в Yii2 лучше разбирать как цепочку. Сначала веб-сервер, потом urlManager, потом контроллер, потом данные. Такой порядок быстрее, чем править все правила маршрутизации подряд и надеяться, что одно из них сработает.
Комментарии (0)
Пока нет комментариев. Будьте первым!