- Где лучше возвращать ошибку 404 в yii2
- 2 ответа 2
- Обработка ошибок
- Свой формат ответа с ошибкой #
- На сайте открывается только главная страница сайта, на внутренних страницах ошибка 404
- 1 ответ 1
- Всё ещё ищете ответ? Посмотрите другие вопросы с метками yii2 nginx или задайте свой вопрос.
- Похожие
- Подписаться на ленту
- Где в Yii2 файлы ошибок 404 и 403(хочется перевести эти страницы)?
- Yii2: лучший способ перехватить 404 и перенаправить 301 на новую страницу?
- 3 ответа
Где лучше возвращать ошибку 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.
Помимо этого можно использовать поведение 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. Для этого интерфейса вам понадобятся две функции:
- parseRequest: используйте этот метод, чтобы проверить, соответствует ли запрос старому URL-адресу. Если это так, перенаправьте на новый URL, иначе верните false. Вы можете проверить таблицу базы данных или список старых URL-адресов, что хотите.
- createUrl: поскольку эти старые URL-адреса больше не работают, createUrl просто нужно вернуть false.
Кроме того, я бы назвал это последним правилом ваших правил UrlManager, чтобы оно вообще не влияло на другие ваши страницы, на производительность или скрытие новых URL-адресов.
Источник