Yii2: Как исправить ошибку 404 при смене контроллера по умолчанию на расширенном шаблоне?

1

Я изменил свой $defaultRoute в моей конфигурации, который выглядит так. Это соответствует моему контроллеру AdminController по умолчанию? Я получаю ошибку 404

Основной-local.php

<?php
$config = [
'defaultRoute' => 'admin/index',
'components' => [
    'request' => [
        // !!! insert a secret key in the following (if it is empty) - this is required by cookie validation
        'cookieValidationKey' => 'b0pQ7nOuVjCprrOGrTarC-ErVMHUWQbb',
    ],
  ],
];
if (!YII_ENV_TEST) {
// configuration adjustments for 'dev' environment
$config['bootstrap'][] = 'debug';
$config['modules']['debug'] = 'yii\debug\Module';

$config['bootstrap'][] = 'gii';
$config['modules']['gii'] = 'yii\gii\Module';
}

return $config;

Я тестирую свое приложение на localhost, но у меня все еще есть моя основная конфигурация с корнем по умолчанию.

main.php

<?php
$params = array_merge(
require(__DIR__ . '/../../common/config/params.php'),
require(__DIR__ . '/../../common/config/params-local.php'),
require(__DIR__ . '/params.php'),
require(__DIR__ . '/params-local.php')
);
return [
'id' => 'app-backend',
'basePath' => dirname(__DIR__),
'controllerNamespace' => 'backend\controllers',
'bootstrap' => ['log'],
'defaultRoute' => 'admin/index',
'modules' => [],
'components' => [
    'user' => [
        'identityClass' => 'backend\models\Admin',
        'enableAutoLogin' => true,
    ],
    'log' => [
        'traceLevel' => YII_DEBUG ? 3 : 0,
        'targets' => [
            [
                'class' => 'yii\log\FileTarget',
                'levels' => ['error', 'warning'],
            ],
        ],
    ],
    'errorHandler' => [
        'errorAction' => 'admin/error',
    ],
],
'params' => $params,
];

Мой .htaccess имеет следующий код:

Options +FollowSymLinks
IndexIgnore */*
RewriteEngine on

# if request begins with /admin remove admin and ad /backend/web/
RewriteCond %{REQUEST_URI} ^/admin
RewriteRule ^admin\/?(.*) /backend/web/$1

# other requests add /frontend/web/$1
RewriteCond %{REQUEST_URI} !^/(frontend/web|backend/web|admin)
RewriteRule (.*) /frontend/web/$1

# if frontend request 
RewriteCond %{REQUEST_URI} ^/frontend/web
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /frontend/web/index.php 

# if backend request
RewriteCond %{REQUEST_URI} ^/backend/web
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /backend/web/index.php

Также здесь мой код AdminController:

<?php
namespace backend\controllers;
use Yii;
use yii\filters\AccessControl;
use yii\web\Controller;
use backend\models\LoginForm;
use yii\filters\VerbFilter;
 class AdminController extends Controller
  {
   public function behaviors()
  {
    return [
        'access' => [
            'class' => AccessControl::className(),
            'rules' => [
                [
                    'actions' => ['login', 'error'],
                    'allow' => true,
                ],
                [
                    'actions' => ['logout', 'index'],
                    'allow' => true,
                    'roles' => ['@'],
                ],
            ],
        ],
        'verbs' => [
            'class' => VerbFilter::className(),
            'actions' => [
                'logout' => ['post'],
            ],
        ],
    ];
}

/**
 * @inheritdoc
 */
public function actions()
{
    return [
        'error' => [
            'class' => 'yii\web\ErrorAction',
        ],
    ];
}

public function actionIndex()
{
    return $this->render('index');
}

public function actionLogin()
{
    if (!\Yii::$app->user->isGuest) {
        return $this->goHome();
    }

    $model = new LoginForm();
    if ($model->load(Yii::$app->request->post()) && $model->login()) {
        return $this->goBack();
    } else {
        return $this->render('login', [
            'model' => $model,
        ]);
    }
}

public function actionLogout()
{
    Yii::$app->user->logout();

    return $this->goHome();
}
}

Я вставляю 'defaultRoute' => 'myController/myAction', в неправильный файл. Я не хочу делать это на самом коде фреймворка, поэтому я очень благодарен за вашу помощь.

  • 0
    Это в директории бэкэнда?
  • 0
    @ n099y да, это бэкэнд-каталог.
Показать ещё 5 комментариев
Теги:
yii2
yii2-advanced-app
yii-components

2 ответа

1

Ваше место размещения правильно для свойства defaultRoute.

Вы пытались установить его на что-то другое, кроме admin/index, у которого нет правила в вашем.htaccess?

Если это работает, вы знаете, что ваш.htaccess противоречит ему, и я попробую следующее.

Я бы удалил пользовательские правила.htaccess (я буду называть их блоками 1,2,4) по одному, оставив остальные блоки. Если это не сработает, удалите 1 & 2 вместе; то я попробую все. Делая это, это должно помочь вам сузить проблему.

Обратите внимание: если вы удалите правила, вам придется соответствующим образом скорректировать ваш URL-адрес для тестов (т.е. Добавить backend/web/back to url, чтобы yourAppName/backend/web должен был довести вас до вашего admin/index) У вас есть правила удаления бэкэнда/веб-страницы из вашего URL-адреса для вас.

Если это не.htaccess, тогда это должен быть какой-то другой код, который у вас есть в вашем приложении, которое является обычным.

Вот правило.htaccess для удаления.index

#Use if on shared hosting and this not in the root folder.
#RewriteBase /

RewriteEngine on

# if a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# otherwise forward it to index.php
RewriteRule . index.php
  • 0
    В настоящее время я пытаюсь найти проблему, используя ваше предложение установить что-то еще в defaultRoute. Так что это помогло мне сделать шаг вперед. Я ввел тест Settings контроллера, и он на самом деле работает. Проблема в том, что когда я переключаюсь обратно на свой контроллер администратора, он перенаправляет на index.php?r=site/login. Хотя я еще не выяснил, почему.
  • 0
    Я предполагаю, что именно ваши правила доступа делают его перенаправленным. Если это так, то только гость перенаправлены и не вошли в систему пользователей. Однако вам необходимо добавить «index» в ваше первое правило доступа в свойстве «access» вашего контроллера, однако это позволит не авторизованным пользователям просматривать страницу администратора. Я также обновил ответ, чтобы удалить r = index.php из вашего URL, однако вам также необходимо обновить ваш urlmanager, чтобы отразить изменения. Это должно быть в точности как @Bharat Chauhan. Правила, конечно, могут быть разными.
Показать ещё 2 комментария
-1

Выньте это из main-local.php

Внутри main.php он находится в правильном месте.

'defaultRoute' => 'admin/index',

Обратите внимание, что вам нужно разместить AdminController в каталоге @backend/controller, как указано в этом утверждении в коде.

'controllerNamespace' => 'backend\controllers',
  • 0
    Все еще получаю ошибку 404. У меня уже был мой AdminController в каталоге backend / controllers.
  • 0
    Я вставил бы ваш .htaccess, потому что без правил urlmanger и этой настройки он должен направлять их все на ваш контроллер по умолчанию.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню