Yii2 настроить 404 страницу

Где лучше возвращать ошибку 404 в yii2

В приложении в контроллере user есть несколько экшнов, каждый из которых получает из запроса параметр user_id и по нему ищет пользователя в бд. Отсюда возникаем необходимость проверять существует ли пользователь с указанным id и если такого нет то возвращать сообщение об ошибке

Где лучше будет вставить код с проверкой чтобы избежать повторения одного и того же кода во всех экшнах?

2 ответа 2

В контроллере можно создать метод который будет возвращать пользователя в противном случаи кидать Exception

Простой вариант — базовый контроллер (от которого потом отнаследуете все остальные) в котором необходимо переопределить метод beforeAction. В нем вы будете проверять ваше условие и выбрасывать ошибку. Это будет работать, но будет несколько неправильно идеологически. В вашем случае, насколько я понимаю, вы проверяете аутентификацию пользователя — можно создать базовый контроллер, с поведением authenticator (подробнее здесь http://www.yiiframework.com/doc-2.0/guide-rest-authentication.html), и значением

где UserIDAuth — это потомок класса AuthMethod реализующий метод authenticate в котором вы осуществите свою проверку и вернете либо аутентифицированного пользователя либо null, если он не найден. Если пользователь не найден — то будет выброшена ошибка. Если найден — то его пропустит дальше, при этом впоследствии можно обращаться к модели аутентифицированного пользователя через Yii::$app->getUser(). Можно переопределить выбрасываемую ошибку на 404. Можно оставить как есть — 403 что возможно будет правильнее для вашего случая. Управлять применением аутентификатора к определенным actionам можно так же через поведение authenticator — поля optional, only, except.

Читайте также:  Не работает эксплорер 2017

Помимо этого можно использовать поведение access со значением

в котором фильтром будет выступать реализованный вами класс AccessFilter наследованный от ActionFilter с переопределенным методом beforeAction в котором вы осуществите вашу проверку и вернете булево значение пропускать пользователя дальше или нет. P.S — если у вас user_id — это действительно значение передаваемое в get параметрах, по которому вы проверяете аутентификацию — хотелось бы предостеречь вас от такой реализации т.к это очень небезопасно — возможно стоит посмотреть в сторону Oauth или хотя бы Basic авторизации поверх https

Источник

Обработка ошибок

Если при обработке запроса к RESTful API в запросе пользователя обнаруживается ошибка или происходит что-то непредвиденное на сервере, вы можете просто выбрасывать исключение, чтобы уведомить пользователя о нештатной ситуации. Если вы можете установить конкретную причину ошибки (например, запрошенный ресурс не существует), вам следует подумать о том, чтобы выбрасывать исключение с соответствующим кодом состояния HTTP (например, yii\web\NotFoundHttpException, соответствующее коду состояния 404). Yii отправит ответ с соответствующим HTTP-кодом и текстом. Он также включит в тело ответа сериализованное представление исключения. Например:

Сводный список кодов состояния HTTP, используемых REST-фреймворком Yii:

  • 200 : OK. Все сработало именно так, как и ожидалось.
  • 201 : Ресурс был успешно создан в ответ на POST -запрос. Заголовок Location содержит URL, указывающий на только что созданный ресурс.
  • 204 : Запрос обработан успешно, и в ответе нет содержимого (для запроса DELETE , например).
  • 304 : Ресурс не изменялся. Можно использовать закэшированную версию.
  • 400 : Неверный запрос. Может быть связано с разнообразными проблемами на стороне пользователя, такими как неверные JSON-данные в теле запроса, неправильные параметры действия, и т.д.
  • 401 : Аутентификация завершилась неудачно.
  • 403 : Аутентифицированному пользователю не разрешен доступ к указанной точке входа API.
  • 404 : Запрошенный ресурс не существует.
  • 405 : Метод не поддерживается. Сверьтесь со списком поддерживаемых HTTP-методов в заголовке Allow .
  • 415 : Не поддерживаемый тип данных. Запрашивается неправильный тип данных или номер версии.
  • 422 : Проверка данных завершилась неудачно (в ответе на POST -запрос, например). Подробные сообщения об ошибках смотрите в теле ответа.
  • 429 : Слишком много запросов. Запрос отклонен из-за превышения ограничения частоты запросов.
  • 500 : Внутренняя ошибка сервера. Возможная причина — ошибки в самой программе.

Свой формат ответа с ошибкой #

Вам может понадобиться изменить формат ответа с ошибкой. Например, вместо использования разных статусов ответа HTTP для разных ошибок, вы можете всегда отдавать статус 200, а реальный код статуса отдавать как часть JSON ответа:

Для этого можно использовать событие beforeSend компонента response прямо в конфигурации приложения:

Приведённый выше код изменит формат ответа (как для удачного запроса, так и для ошибок) если передан GET -параметр suppress_response_code .

Источник

На сайте открывается только главная страница сайта, на внутренних страницах ошибка 404

На сайте созданный на yii2 открывается только главная страница сайта, на внутренних страницах ошибка 404. Сайт работает в режиме Nginx + PHP-FPM . В данном случае для решения данной проблемы я попробовала добавить правила для работы сайта в конфигурационный файл сервера Nginx .

В /etc/nginx/vhosts/user/example.com.conf, я добавила такие правила:

Вот настройки urlManager :

Я с nginx столкнулась первый раз. Попросили наладить сайт. Но я не могу понять что ещё можно туда добавить. Может кто-нибудь поможет?

1 ответ 1

Спасибо огромное всем за попытку помочь мне, я решила свою проблему. В конфигурационном файле nginx пропиcаны такие правила:

Всё ещё ищете ответ? Посмотрите другие вопросы с метками yii2 nginx или задайте свой вопрос.

Похожие

Подписаться на ленту

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

дизайн сайта / логотип © 2021 Stack Exchange Inc; материалы пользователей предоставляются на условиях лицензии cc by-sa. rev 2021.10.15.40479

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

Источник

Где в Yii2 файлы ошибок 404 и 403(хочется перевести эти страницы)?

В файле error.php в папке views уже перевёл, часть текста.

Но я хочу перевести ещё и эти записи ->
Forbidden (#403)
You are not allowed to access this page.
Not Found (#404)

  • Вопрос задан более трёх лет назад
  • 4053 просмотра

Здравствуйте товарищи программисты.

Не так страшен код, как его трактуют ))
Подсказку к этому вопросу как ни странно, я нашёл в папке «views/site/»
Файл: error.php
===
Разработчики поняли, что программисты столкнуться с таким вопросом, поэтому оставили подсказки:

Из них мы видим, что переменную
нам даёт title;?>
А свалился этот нейм на наши головы из класса View !
Проведя рефакторинг, я понял, что за
Отвечает языковой пакет Yii2/
А именно. /vendor/yiisoft/yii2/messages/ru/
Если конечно вы в конфиге файла main.php указали русский язык. Там их куча, вы можете в этом убедится, да и сам класс показал, что используется модель подставки сообщений, через конструкцию:

Вы спросите, а нахера такой геморрой нужен??

Отвечаю, во-первых, это не геморрой, а очень даже классное решение! Убивает сразу двух зайцев наповал! Мультиязычность — раз, Повторяющиеся элементы — два! Благодаря такому решению не надо ковырять весь код, достаточно заменяющие элементы заменить такой конструкцией, и всё, поменял текст или дизайн кнопки «обновить», сделал это в одном месте, в файле yii.php и всё, дизайн и текст поменялся во всём сайте, а отредактировали один файл. Это невероятно удобно. Так и с ошибками и с сообщениями, зачем писать на каждой страничке ручками «ваше сообщение успешно отправлено», если можно прописать значение = перевод. Так вот, в голове кода была ещё одна подсказка /* @var $exception Exception */
и в самом классе ссылка на мануал php7 — php.net/manual/ru/exception.getmessage.php

Таким образом мы имеем:

Ну так, раз мы можем указать код ошибки, public $statusCode;
То можно тупо и условия поставить, например:

А текст ошибки под заголовком редактируется в языковом пакете:
/vendor/yiisoft/yii2/messages/ru/yii.php
$message

Выводится как и т д.
Но вам выводить ничего не надо, класс сам определит код ошибки и выведет её текст.
Как заменить заголовок ошибки я уже написал выше.


Это был полный разбор страницы ошибок, благодарю всех за внимание. Пока 🙂

Источник

Yii2: лучший способ перехватить 404 и перенаправить 301 на новую страницу?

В целях SEO я хочу перенаправить свои старые URL-адреса, отличные от Yii2, на новые. Поэтому мне нужно перехватить 404, которое выдает Yii, и ответить перенаправлением 301. Где лучше всего это делать?

3 ответа

Пока что я сам нашел следующие возможные способы сделать это:

Метод 1:

Этот метод выполняет это до обработки запроса — на основе известных URL-адресов. Они вступают в силу только в том случае, если URL-адрес не указывает непосредственно на существующие файлы / папки (иначе .htaccess никогда не перенаправит запрос на Yii).

В config/web.php добавьте следующее в массив конфигурации:

Метод 2:

Этот метод выполняет это после обработки запроса — на основании отсутствия маршрута и получения 404. Это имеет то преимущество, что мы также можем обрабатывать неизвестные URL-адреса, которые попали в 404.

Добавьте класс начальной загрузки согласно документации сюда и здесь. Затем добавьте это в свой метод bootstrap ():

Вот еще один вариант.

Я бы добавил старые URL-адреса в config/url-manager.php (или backend/config/url-manager.php в случае расширенного шаблона), чтобы обработать их соответствующим действием контроллера и выполнить перенаправление в контроллере.

Пример, предполагающий, что включен красивый URL, а старый URL — posts/list , а новый простой posts , тогда к правилам в url-manager нужно добавить следующее:

Это направит старый URL-адрес в PostController модуля сообщений. Добавьте в контроллер следующее действие:

Конечно, у вас может быть много старых URL-адресов, и вы не хотите обрабатывать их один за другим, чем добавлять параметры в правило и обрабатывать параметры в действии перенаправления.

Вы можете создать класс, реализующий yii \ web \ UrlRuleInterface. Для этого интерфейса вам понадобятся две функции:

  1. parseRequest: используйте этот метод, чтобы проверить, соответствует ли запрос старому URL-адресу. Если это так, перенаправьте на новый URL, иначе верните false. Вы можете проверить таблицу базы данных или список старых URL-адресов, что хотите.
  2. createUrl: поскольку эти старые URL-адреса больше не работают, createUrl просто нужно вернуть false.

Кроме того, я бы назвал это последним правилом ваших правил UrlManager, чтобы оно вообще не влияло на другие ваши страницы, на производительность или скрытие новых URL-адресов.

Источник

Оцените статью