переадресация на /site/login вместо /login

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
iamguruman
Сообщения: 236
Зарегистрирован: 2018.05.10, 08:26

переадресация на /site/login вместо /login

Сообщение iamguruman »

Есть контроллер SiteController:

Код: Выделить всё

<?php

namespace app\controllers;

use app\models\User;
use Yii;
use yii\filters\AccessControl;
use yii\web\Controller;
use yii\filters\VerbFilter;
use app\models\LoginForm;

class SiteController extends Controller
{
    public function behaviors()
    {
        return [
            'access' => [
                'class' => AccessControl::className(),
                'only' => ['logout'],
                'rules' => [
                    [
                        'actions' => ['logout'],
                        'allow' => true,
                        'roles' => ['@'],
                    ],
                ],
            ],
            'verbs' => [
                'class' => VerbFilter::className(),
                'actions' => [
                    'logout' => ['post'],
                ],
            ],
        ];
    }

    public function actions()
    {
        return [
            'error' => [
                'class' => 'yii\web\ErrorAction',
            ],
            'captcha' => [
                'class' => 'yii\captcha\CaptchaAction',
            ],
        ];
    }

    public function actionIndex()
    {

        if(Yii::$app->user->isGuest){
            return $this->redirect('/login');
        }

        return $this->render('index');

    }

}
В случае если пользватель гость, то его переадресовывать должно на страницу /login, но почему-то переадресация происходит на /site/login

почему?

п.с. есть также контролле LoginController:

в нем нет намека на передаресация /site/login

Код: Выделить всё

<?php


namespace app\controllers;

use app\models\User;
use Yii;
use yii\filters\AccessControl;
use yii\web\Controller;

class LoginController extends Controller
{

    public function behaviors()
    {
        return [
            'access' => [
                'class' => AccessControl::className(),
                'rules' => [
                    [
                        'allow' => true,
                        'roles' => ['@']
                    ],
                ],
            ]
        ];
    }

    public function actions()
    {
        return [
            'error' => [
                'class' => 'yii\web\ErrorAction',
            ],
            'captcha' => [
                'class' => 'yii\captcha\CaptchaAction',
            ],
        ];
    }

    public function actionIndex()
    {

        $error_msg = null;

        if(!Yii::$app->user->isGuest){
            $this->redirect('/');
        }

        //Yii::$app->user->login(User::findOne(3),0);

        if(Yii::$app->request->post()){

            $username = Yii::$app->request->post('username');

            $password = Yii::$app->request->post('password');

            if($user = User::findOne(['username' => $username])){

                if(Yii::$app->getSecurity()->validatePassword($password, $user->password_hash)){

                    if(Yii::$app->user->login($user)){

                        return $this->redirect('/');

                    } else {
                        die('login error');
                    }
                }

                $error_msg = "Login or Password is not correct";

            }

        }

        return $this->render('index',[
            'error_msg' => $error_msg,
        ]);

    }

}
где еще может быть код переадресацией на /site/login?
slo_nik
Сообщения: 344
Зарегистрирован: 2013.10.07, 19:08

Re: переадресация на /site/login вместо /login

Сообщение slo_nik »

Доброе утро.
В настройках urlManager нужно создать правило.

Код: Выделить всё

'<_a:(login|logoun)>' => 'login/<_a>'
И в redirect указать контроллер/действие

Код: Выделить всё

return $this->redirect('login/index');
iamguruman
Сообщения: 236
Зарегистрирован: 2018.05.10, 08:26

Re: переадресация на /site/login вместо /login

Сообщение iamguruman »

Сделал
slo_nik писал(а): 2020.12.07, 11:40 В настройках urlManager нужно создать правило.
'<_a:(login|logoun)>' => 'login/<_a>'
https://prnt.sc/vxivt8
slo_nik писал(а): 2020.12.07, 11:40 И в redirect указать контроллер/действие
return $this->redirect('login/index');
https://prnt.sc/vxiv7g

Пока нет результата. Возможно не туда записал?

п.с. я не пойму почему такое появилось, раньше без этого работало... и вот никак не пойму что вызвало необходимость этих изменений
iamguruman
Сообщения: 236
Зарегистрирован: 2018.05.10, 08:26

Re: переадресация на /site/login вместо /login

Сообщение iamguruman »

Меня именно смущает сам момент что происходит автоматическая переадресация на /site/login когда я набираю /login

Нигде такого правила нет.
Это проблема решается явно переустановкой всего приложения, но хотелось бы понять хотя бы куда копать, чтобы "такое" понимать на будущее. Может есть идеи? В SiteController и LoginController нет ничего похожего на такие операции:

Код: Выделить всё

class SiteController extends Controller
{
    public function behaviors()
    {
        return [
            'access' => [
                'class' => AccessControl::className(),
                'only' => ['logout'],
                'rules' => [
                    [
                        'actions' => ['logout'],
                        'allow' => true,
                        'roles' => ['@'],
                    ],
                ],
            ],
            'verbs' => [
                'class' => VerbFilter::className(),
                'actions' => [
                    'logout' => ['post'],
                ],
            ],
        ];
    }

    public function actions()
    {
        return [
            'error' => [
                'class' => 'yii\web\ErrorAction',
            ],
            'captcha' => [
                'class' => 'yii\captcha\CaptchaAction',
            ],
        ];
    }

    public function actionIndex()
    {

        if(Yii::$app->user->isGuest){
            return $this->redirect('/login/index');
        }

        return $this->render('index');

    }

}

Код: Выделить всё

class LoginController extends Controller
{

    public function behaviors()
    {
        return [
            'access' => [
                'class' => AccessControl::className(),
                'rules' => [
                    [
                        'allow' => true,
                        'roles' => ['@']
                    ],
                ],
            ]
        ];
    }

    public function actions()
    {
        return [
            'error' => [
                'class' => 'yii\web\ErrorAction',
            ],
            'captcha' => [
                'class' => 'yii\captcha\CaptchaAction',
            ],
        ];
    }

    public function actionIndex()
    {

        $error_msg = null;

        if(!Yii::$app->user->isGuest){
            $this->redirect('/');
        }

        //Yii::$app->user->login(User::findOne(3),0);

        if(Yii::$app->request->post()){

            $username = Yii::$app->request->post('username');

            $password = Yii::$app->request->post('password');

            if($user = User::findOne(['username' => $username])){

                if(Yii::$app->getSecurity()->validatePassword($password, $user->password_hash)){

                    if(Yii::$app->user->login($user)){

                        return $this->redirect('/');

                    } else {
                        die('login error');
                    }
                }

                $error_msg = "Login or Password is not correct";

            }

        }

        return $this->render('index',[
            'error_msg' => $error_msg,
        ]);

    }

}
настройки урлменеджера пустые или такие не помогают?

Код: Выделить всё

'urlManager' => [
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'rules' => [
                'login' => '/login/index',
            ],
        ],
результат все равно: https://prnt.sc/vysd4h
iamguruman
Сообщения: 236
Зарегистрирован: 2018.05.10, 08:26

Re: переадресация на /site/login вместо /login

Сообщение iamguruman »

Интереса ради добавлял actionLogin в SiteController:

результат ожидаем: https://prnt.sc/vyse6i (много переадресаций)

Код: Выделить всё

class SiteController extends Controller
{
    public function behaviors()
    {
        return [
            'access' => [
                'class' => AccessControl::className(),
                'only' => ['logout'],
                'rules' => [
                    [
                        'actions' => ['logout'],
                        'allow' => true,
                        'roles' => ['@'],
                    ],
                ],
            ],
        ];
    }

    public function actions()
    {
        return [
            'error' => [
                'class' => 'yii\web\ErrorAction',
            ],
            'captcha' => [
                'class' => 'yii\captcha\CaptchaAction',
            ],
        ];
    }

    public function actionLogin(){
        return $this->redirect('/login');
    }
Не понимаю откуда берется эта переадресация на /site/login

Есть контролле LoginController...
По умолчанию как мне кажется app должно посмотреть в папку с контроллерами и найти контроллер Login и в нем метод index в случае если включено showprettyurl=true если открываем страницу /login

Как можно найти причину переадресацию на /site/login ?
iamguruman
Сообщения: 236
Зарегистрирован: 2018.05.10, 08:26

Re: переадресация на /site/login вместо /login

Сообщение iamguruman »

Ларчик просто открывался... вот в чем дело...
В контроллере Login я добавил поведение:

Код: Выделить всё

    public function behaviors()
    {
        return [
            'access' => [
                'class' => AccessControl::className(),
                'rules' => [
                    [
                        'allow' => true,
                        'roles' => ['@']
                    ],
                ],
            ]
        ];
    }
цель этого поведения проверять пользователя на "авторизован" или "гость"...
и тут правило разрешать входить только "не гостям",
следовательно видимо app автоматически отправляла пользователя на /site/login, т.к. /login только для авторизованных пользователей
Ответить