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

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

main-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;

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

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', не в тот файл. Я не хочу делать это в самом коде фреймворка, поэтому буду очень признателен за вашу помощь.


person Zack    schedule 07.07.2015    source источник
comment
Это в бэкэнд-каталоге?   -  person n099y    schedule 07.07.2015
comment
@ n099y да, это внутренний каталог.   -  person Zack    schedule 07.07.2015
comment
Можете ли вы вставить свой htaccess и код вашего администратора.   -  person n099y    schedule 07.07.2015
comment
Я добавил в код вопроса.   -  person Zack    schedule 07.07.2015
comment
Я не вижу, что вы изменили, пишет, что вы не редактировали вопрос...   -  person n099y    schedule 07.07.2015
comment
Готово, я прокомментировал во время редактирования. Мои извенения.   -  person Zack    schedule 07.07.2015
comment
Давайте продолжим обсуждение в чате.   -  person Zack    schedule 07.07.2015


Ответы (2)


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

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

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

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

Обратите внимание, что если вы удалите правила, вам придется соответствующим образом скорректировать свой URL-адрес для тестов (например, добавить backend/web/ обратно к вашему URL-адресу, чтобы yourAppName/backend/web приводило вас к вашему администратору/индексу), как только вы это сделаете. У меня нет правил удаления бэкенда/веб-сайта из вашего 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
person skworden    schedule 09.07.2015
comment
В настоящее время я пытаюсь найти проблему, используя ваше предложение установить что-то еще в defaultRoute. Так что это помогло мне продвинуться на шаг вперед. Я представил тестовый контроллер Settings, и он действительно работает. Проблема в том, что когда я возвращаюсь к своему контроллеру администратора, он перенаправляется на index.php?r=site/login., хотя я еще не выяснил, почему. - person Zack; 09.07.2015
comment
Я бы предположил, что это ваши правила доступа, которые делают его перенаправленным. Если это так, то перенаправляются только гости, а не зарегистрированные пользователи. Однако вам нужно будет добавить «индекс» к вашему первому правилу доступа в свойстве доступа вашего контроллера, что позволит пользователям, не вошедшим в систему, просматривать страницу администратора. Я также обновил ответ, чтобы удалить r=index.php из вашего URL-адреса, однако вам также необходимо обновить свой urlmanager, чтобы отразить изменения. Это должно быть точно так, как написал @Bharat Chauhan. Правила, конечно, могут быть разными. - person skworden; 09.07.2015
comment
Вы смотрели мой текущий .htaccess? Это выглядит точно так же, за исключением того факта, что ваш базовый шаблон. - person Zack; 09.07.2015
comment
Да, его можно использовать в базовом шаблоне, однако это первая часть моих расширенных шаблонов .htaccess, и он работает. У вас есть .htaccess в вашем внешнем интерфейсе/веб-интерфейсе и в вашем бэкэнде/веб-сайте? Похоже, у вас их нет, и они должны быть в обоих местах. Опубликуйте свою структуру папок, потому что ваш htaccess неверен, и без него никто не сможет вам помочь. - person skworden; 10.07.2015

Уберите его из main-local.php

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

'defaultRoute' => 'admin/index',

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

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