yii2 - 前端到后端和后端到前端控制器配置文件 + .htaccess - 完全配置
yii2 - frontend to backend and backend to frontend controller config files + .htaccess - COMPLETLY CONFIGURATION
我正在尝试使用 .htaccess
文件和两个 links/button 或重定向来完全管理我的页面:
- 一个从前端到后端
- 一个从后端到前端
希望已经足够清楚了。
我的环境是 DEV,因为我在本地工作,如果有那么大的不同。
我都试过了:
- https://www.yiiframework.com/forum/index.php/topic/60118-creating-links-from-backend-to-frontend-and-frontend-to-backend/
- From Backend to Frontend Yii2 Advanced App
- https://github.com/yiisoft/yii2/issues/1578
- https://www.youtube.com/watch?v=nvMlc1lCOOo
我对 .htaccess
文件和 urlManager
有点困惑,非常感谢您的帮助。
让我们检查一下文件:
根目录和普通目录
/.htacces
#prevent directory listing
Options -Indexes
IndexIgnore */*
#follow symbolic links
Options FollowSymlinks
RewriteEngine on
RewriteRule ^admin(/.+)?$ backend/web/ [L,PT]
RewriteRule ^(.+)?$ frontend/web
/common/config/main.php
return [
'aliases' => [
'@bower' => '@vendor/bower-asset',
'@npm' => '@vendor/npm-asset',
],
'vendorPath' => dirname(dirname(__DIR__)) . '/vendor',
'components' => [
'cache' => [
'class' => 'yii\caching\FileCache',
],
],
];
前端和前端控制器
/frontend/.htacces
RewriteEngine on
#if directory or a file exist, use the request directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
#otherwise, forward to index.php
RewriteRule . index.php
/frontend/config/main.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-frontend',
'basePath' => dirname(__DIR__),
'bootstrap' => ['log'],
'controllerNamespace' => 'frontend\controllers',
'components' => [
'request' => [
'csrfParam' => '_csrf-frontend',
],
// main - used to generate and parse URLs to frontend from
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'baseUrl' => '/frontend/web',
'rules' => [
'/' => 'site/index',
'home' => 'site/home',
'about' => 'site/about',
'moje-prace' => 'site/moje-prace',
'umow-wizyte' => 'rezerwacje/create',
'contact' => 'site/contact',
'login' => 'site/login',
'signup' => '/site/signup',
],
],
// slave - used to generate URLs to backend from frontend app
'urlManagerBackend' => [
'class' => 'yii\web\urlManager',
'baseUrl' => '/admin',
'enablePrettyUrl' => true,
'showScriptName' => false,
]
'user' => [
'identityClass' => 'common\models\User',
'enableAutoLogin' => true,
'identityCookie' => ['name' => '_identity-frontend', 'httpOnly' => true],
],
'session' => [
// this is the name of the session cookie used for login on the frontend
'name' => 'advanced-frontend',
],
'log' => [
'traceLevel' => YII_DEBUG ? 3 : 0,
'targets' => [
[
'class' => 'yii\log\FileTarget',
'levels' => ['error', 'warning'],
],
],
],
'errorHandler' => [
'errorAction' => 'site/error',
],
],
'params' => $params,
];
/frontend/controllers/SiteController.php
namespace frontend\controllers;
use Yii;
use yii\base\InvalidParamException;
use yii\web\BadRequestHttpException;
use yii\web\Controller;
use yii\filters\VerbFilter;
use yii\filters\AccessControl;
use common\models\LoginForm;
use frontend\models\PasswordResetRequestForm;
use frontend\models\ResetPasswordForm;
use frontend\models\SignupForm;
use frontend\models\ContactForm;
/**
* Site controller
*/
class SiteController extends Controller
{
/**
* {@inheritdoc}
*/
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::className(),
'only' => ['logout', 'index', 'home', 'contact', 'about'],
'rules' => [
[
'actions' => ['logout'],
'allow' => true,
'roles' => ['@'],
],
[
'actions' => ['index'],
'allow' => true,
'roles' => ['@'],
],
[
'actions' => ['home'],
'allow' => true,
'roles' => ['@'],
],
[
'actions' => ['contact'],
'allow' => true,
'roles' => ['@'],
],
[
'actions' => ['about'],
'allow' => true,
'roles' => ['@'],
],
],
],
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
'logout' => ['post'],
],
],
];
}
/**
* {@inheritdoc}
*/
public function actions()
{
return [
'error' => [
'class' => 'yii\web\ErrorAction',
],
'captcha' => [
'class' => 'yii\captcha\CaptchaAction',
'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null,
],
];
}
/**
* Displays homepage.
*
* @return mixed
*/
public function actionIndex()
{
if (!Yii::$app->user->isGuest) {
$this->layout = 'main';
return $this->render('home');
}
return $this->goHome();
}
/**
* Displays about page.
*
* @return mixed
*/
public function actionHome()
{
return $this->render('home');
}
/**
* Logs in a user.
*
* @return mixed
*/
public function actionLogin()
{
$this->layout = 'welcome';
if (!Yii::$app->user->isGuest) {
$this->layout = 'main';
return $this->render('home');
}
$model = new LoginForm();
if ($model->load(Yii::$app->request->post()) && $model->login()) {
$this->layout = 'main';
return $this->render('home');
}
else {
$model->password = '';
return $this->render('login', [
'model' => $model,
]);
}
}
/**
* Logs out the current user.
*
* @return mixed
*/
public function actionLogout()
{
Yii::$app->user->logout();
return $this->goHome();
}
/**
* Displays contact page.
*
* @return mixed
*/
public function actionContact()
{
$model = new ContactForm();
if ($model->load(Yii::$app->request->post()) && $model->validate()) {
if ($model->sendEmail(Yii::$app->params['adminEmail'])) {
Yii::$app->session->setFlash('success', 'Thank you for contacting us. We will respond to you as soon as possible.');
}
else {
Yii::$app->session->setFlash('error', 'There was an error sending your message.');
}
return $this->refresh();
}
else {
return $this->render('contact', [
'model' => $model,
]);
}
}
/**
* Displays about page.
*
* @return mixed
*/
public function actionAbout()
{
return $this->render('about');
}
/**
* Signs user up.
*
* @return mixed
*/
public function actionSignup()
{
$this->layout = 'welcome';
$model = new SignupForm();
if ($model->load(Yii::$app->request->post())) {
if ($user = $model->signup()) {
if (Yii::$app->getUser()->login($user)) {
$this->layout = 'main';
return $this->actionHome();
}
}
}
return $this->render('signup', [
'model' => $model,
]);
}
后端和后端控制器
/backend/.htacces
RewriteEngine on
#if directory or a file exist, use the request directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
#otherwise, forward to index.php
RewriteRule . index.php
/backend/config/main.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'],
'homeUrl' => '/administrator',
'modules' => [],
'components' => [
'request' => [
'csrfParam' => '_csrf-backend',
'baseUrl' => '/administrator',
],
'user' => [
'identityClass' => 'common\models\User',
'enableAutoLogin' => true,
'identityCookie' => ['name' => '_identity-backend', 'httpOnly' => true],
],
'session' => [
// this is the name of the session cookie used for login on the backend
'name' => 'advanced-backend',
],
'log' => [
'traceLevel' => YII_DEBUG ? 3 : 0,
'targets' => [
[
'class' => 'yii\log\FileTarget',
'levels' => ['error', 'warning'],
],
],
],
'errorHandler' => [
'errorAction' => 'site/error',
],
// main - used to generate and parse URLs to backend from backend app
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'baseUrl' => '/backend/web',
],
// slave - used to generate URLs to frontend from backend app
'urlManagerFrontend' => [
'class' => 'yii\web\urlManager',
'enablePrettyUrl' => true,
'showScriptName' => false,
'baseUrl' => '/',
'rules' => [
'/' => 'site/index',
'home' => 'site/home',
'about' => 'site/about',
'moje-prace' => 'site/moje-prace',
'umow-wizyte' => 'rezerwacje/create',
'contact' => 'site/contact',
'login' => 'site/login',
'signup' => 'site/signup',
],
],
'params' => $params,
];
/backend/controllers/SiteController.php
namespace backend\controllers;
use Yii;
use yii\web\Controller;
use yii\filters\VerbFilter;
use yii\filters\AccessControl;
use common\models\LoginForm;
/**
* Site controller
*/
class SiteController extends Controller
{
/**
* {@inheritdoc}
*/
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',
],
];
}
/**
* Displays homepage.
*
* @return string
*/
public function actionIndex()
{
return $this->render('index');
}
/**
* Login action.
*
* @return string
*/
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 {
$model->password = '';
return $this->render('login', [
'model' => $model,
]);
}
}
/**
* Logout action.
*
* @return string
*/
public function actionLogout()
{
Yii::$app->user->logout();
return $this->goHome();
}
}
VHOST & APACHE.CONF
apache2.conf
<Directory />
Options FollowSymLinks
AllowOverride All
Require all granted
</Directory>
<Directory /usr/share>
AllowOverride All
Require all granted
</Directory>
<Directory /home/user/project>
Options FollowSymLinks
AllowOverride All
Require all granted
</Directory>
vhost
<VirtualHost *:80>
ServerAdmin admin@prst.app
ServerName pp.test
DocumentRoot /home/user/project/pp/
<Directory "/home/user/project/pp/">
Options FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/pp__error.log
CustomLog ${APACHE_LOG_DIR}/pp_access.log combined
</VirtualHost>
我无法在视图中创建超链接或在控制器中从前端重定向到后端,以及从后端重定向到前端。
我假设您的前端位于 http://localhosts
,后端位于 http://localhosts/admin
。如果您的重写规则无法正常工作,您可以为此尝试 - 至少对我而言,在共享主机上处理 frontend/backend URL 总是更简单且问题更少的方式。
你总是有 2 个 UrlManager
组件:main(对于当前环境)和 slave(对于第二个环境,例如前端应用程序中的后端)。所以在 frontend/config/main.php
你会得到类似的东西:
// ...
// main - used to generate and parse URLs to frontend from frontend app
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'baseUrl' => '/',
'rules' => [
'/' => 'site/index',
'home' => 'site/home',
'about' => 'site/about',
'moje-prace' => 'site/moje-prace',
'umow-wizyte' => 'rezerwacje/create',
'contact' => 'site/contact',
'login' => 'site/login',
'signup' => 'site/signup',
],
],
// slave - used to generate URLs to backend from frontend app
'urlManagerBackend' => [
'class' => 'yii\web\urlManager',
'baseUrl' => '/admin',
'enablePrettyUrl' => true,
'showScriptName' => false,
],
// ...
并且在 backend/config/main.php
中:
// ...
// main - used to generate and parse URLs to backend from backend app
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'baseUrl' => '/admin',
],
// slave - used to generate URLs to frontend from backend app
'urlManagerFrontend' => [
'class' => 'yii\web\urlManager',
'enablePrettyUrl' => true,
'showScriptName' => false,
'baseUrl' => '/',
'rules' => [
'/' => 'site/index',
'home' => 'site/home',
'about' => 'site/about',
'moje-prace' => 'site/moje-prace',
'umow-wizyte' => 'rezerwacje/create',
'contact' => 'site/contact',
'login' => 'site/login',
'signup' => 'site/signup',
],
],
// ...
如您所见,它们已互换 - 前端应用程序中的主要 UrlManager
是后端应用程序中的从属应用程序。根据当前和目标环境,您使用不同的 URL 管理器。
如果你想从后端应用生成URL到前端:
Yii::$app->urlManagerFrontend->createUrl('site/index');
// result: http://localhost
如果你想从 backend app:
生成 URL 到 backend
Yii::$app->urlManager->createUrl('site/index');
// result: http://localhost/admin/site/index
如果你想从前端应用生成URL到后端:
Yii::$app->urlManagerBackend->createUrl('site/index');
// result: http://localhost/admin/site/index
如果你想从 frontend app:
生成 URL 到 frontend
Yii::$app->urlManager->createUrl('site/index');
// result: http://localhost
终于搞定了!在新的 yii2 advanced 上,我在前端和后端之间建立了连接,但是 "sides" 中的 pretty url 仍然存在问题。
后端/.htaccess
RewriteEngine on
#if directory or a file exist, use the request directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
#otherwise, forward to index.php
RewriteRule . index.php
backend/config/main.php
use \yii\web\Request;
$baseUrl = str_replace('/backend/web', '/backend/web', (new Request)->getBaseUrl());
$frontEndBaseUrl = str_replace('/backend/web', '/frontend/web', (new Request)->getBaseUrl());
$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'],
'modules' => [],
'components' => [
'request' => [
'csrfParam' => '_csrf-backend',
],
'user' => [
'identityClass' => 'common\models\User',
'enableAutoLogin' => true,
'identityCookie' => ['name' => '_identity-backend', 'httpOnly' => true],
],
'session' => [
// this is the name of the session cookie used for login on the backend
'name' => 'advanced-backend',
],
'log' => [
'traceLevel' => YII_DEBUG ? 3 : 0,
'targets' => [
[
'class' => 'yii\log\FileTarget',
'levels' => ['error', 'warning'],
],
],
],
'errorHandler' => [
'errorAction' => 'site/error',
],
// main - used to generate and parse URLs to backend from backend app
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'baseUrl' => '/backend/web',
],
// slave - used to generate URLs to frontend from backend app
'urlManagerFrontend' => [
'class' => 'yii\web\urlManager',
'enablePrettyUrl' => true,
'showScriptName' => false,
'baseUrl' => '/',
'rules' => [
'/' => 'site/index',
'home' => 'site/home',
'about' => 'site/about',
'moje-prace' => 'site/moje-prace',
'umow-wizyte' => 'rezerwacje/create',
'contact' => 'site/contact',
'login' => 'site/login',
'signup' => 'site/signup',
],
],
],
'params' => $params,
];
后端link前端
简单创建:
$frontendUrl= Yii::$app->urlManagerFrontend->createUrl('//');
echo yii\helpers\Html::a('link to frontend', $frontendUrl);
前端/.htaccess
RewriteEngine on
#if directory or a file exist, use the request directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
#otherwise, forward to index.php
RewriteRule . index.php
frontend/config/main.php
use \yii\web\Request;
$baseUrl = str_replace('/frontend/web', '/frontend/web', (new Request)->getBaseUrl());
$backEndBaseUrl = str_replace('/frontend/web', '/backend/web', (new Request)->getBaseUrl());
$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-frontend',
'basePath' => dirname(__DIR__),
'bootstrap' => ['log'],
'controllerNamespace' => 'frontend\controllers',
'components' => [
'request' => [
'csrfParam' => '_csrf-frontend',
],
'user' => [
'identityClass' => 'common\models\User',
'enableAutoLogin' => true,
'identityCookie' => ['name' => '_identity-frontend', 'httpOnly' => true],
],
'session' => [
// this is the name of the session cookie used for login on the frontend
'name' => 'advanced-frontend',
],
'log' => [
'traceLevel' => YII_DEBUG ? 3 : 0,
'targets' => [
[
'class' => 'yii\log\FileTarget',
'levels' => ['error', 'warning'],
],
],
],
'errorHandler' => [
'errorAction' => 'site/error',
],
// main - used to generate and parse URLs to frontend from frontend app
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'baseUrl' => $baseUrl,
'rules' => [
'/' => 'site/index',
'/home' => 'site/home',
'/about' => 'site/about',
'moje-prace' => 'site/moje-prace',
'umow-wizyte' => 'rezerwacje/create',
'contact' => 'site/contact',
'login' => 'site/login',
'signup' => '/site/signup',
],
],
// slave - used to generate URLs to backend from frontend app
'urlManagerBackend' => [
'class' => 'yii\web\urlManager',
'baseUrl' => $backEndBaseUrl,
'enablePrettyUrl' => false,
'showScriptName' => false,
],
],
'params' => $params,
];
前端 link 后端
简单创建:
$backendUrl= Yii::$app->urlManagerBackend->createUrl('//');
echo yii\helpers\Html::a('link to backend', $backendUrl);
在根目录中,什么意思 http://localhost/app-name/ 我创建了 index.php 文件用于重定向到前端,同时在后端(到前端)上单击 link:
/index.php
header("Location: http://pp.test/frontend/web/", true, 301);
exit();
现在它工作正常,但我无法在后端启用漂亮的 url,因为它不能正常工作。而且我不认为这是使用从其他文件尤其是从根目录重定向的好方法。
请注意,在 common/config/main.php 中不需要任何更改,也不需要根目录中的 .htaccess 文件。
我正在尝试使用 .htaccess
文件和两个 links/button 或重定向来完全管理我的页面:
- 一个从前端到后端
- 一个从后端到前端
希望已经足够清楚了。
我的环境是 DEV,因为我在本地工作,如果有那么大的不同。
我都试过了:
- https://www.yiiframework.com/forum/index.php/topic/60118-creating-links-from-backend-to-frontend-and-frontend-to-backend/
- From Backend to Frontend Yii2 Advanced App
- https://github.com/yiisoft/yii2/issues/1578
- https://www.youtube.com/watch?v=nvMlc1lCOOo
我对 .htaccess
文件和 urlManager
有点困惑,非常感谢您的帮助。
让我们检查一下文件:
根目录和普通目录
/.htacces
#prevent directory listing
Options -Indexes
IndexIgnore */*
#follow symbolic links
Options FollowSymlinks
RewriteEngine on
RewriteRule ^admin(/.+)?$ backend/web/ [L,PT]
RewriteRule ^(.+)?$ frontend/web
/common/config/main.php
return [
'aliases' => [
'@bower' => '@vendor/bower-asset',
'@npm' => '@vendor/npm-asset',
],
'vendorPath' => dirname(dirname(__DIR__)) . '/vendor',
'components' => [
'cache' => [
'class' => 'yii\caching\FileCache',
],
],
];
前端和前端控制器
/frontend/.htacces
RewriteEngine on
#if directory or a file exist, use the request directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
#otherwise, forward to index.php
RewriteRule . index.php
/frontend/config/main.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-frontend',
'basePath' => dirname(__DIR__),
'bootstrap' => ['log'],
'controllerNamespace' => 'frontend\controllers',
'components' => [
'request' => [
'csrfParam' => '_csrf-frontend',
],
// main - used to generate and parse URLs to frontend from
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'baseUrl' => '/frontend/web',
'rules' => [
'/' => 'site/index',
'home' => 'site/home',
'about' => 'site/about',
'moje-prace' => 'site/moje-prace',
'umow-wizyte' => 'rezerwacje/create',
'contact' => 'site/contact',
'login' => 'site/login',
'signup' => '/site/signup',
],
],
// slave - used to generate URLs to backend from frontend app
'urlManagerBackend' => [
'class' => 'yii\web\urlManager',
'baseUrl' => '/admin',
'enablePrettyUrl' => true,
'showScriptName' => false,
]
'user' => [
'identityClass' => 'common\models\User',
'enableAutoLogin' => true,
'identityCookie' => ['name' => '_identity-frontend', 'httpOnly' => true],
],
'session' => [
// this is the name of the session cookie used for login on the frontend
'name' => 'advanced-frontend',
],
'log' => [
'traceLevel' => YII_DEBUG ? 3 : 0,
'targets' => [
[
'class' => 'yii\log\FileTarget',
'levels' => ['error', 'warning'],
],
],
],
'errorHandler' => [
'errorAction' => 'site/error',
],
],
'params' => $params,
];
/frontend/controllers/SiteController.php
namespace frontend\controllers;
use Yii;
use yii\base\InvalidParamException;
use yii\web\BadRequestHttpException;
use yii\web\Controller;
use yii\filters\VerbFilter;
use yii\filters\AccessControl;
use common\models\LoginForm;
use frontend\models\PasswordResetRequestForm;
use frontend\models\ResetPasswordForm;
use frontend\models\SignupForm;
use frontend\models\ContactForm;
/**
* Site controller
*/
class SiteController extends Controller
{
/**
* {@inheritdoc}
*/
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::className(),
'only' => ['logout', 'index', 'home', 'contact', 'about'],
'rules' => [
[
'actions' => ['logout'],
'allow' => true,
'roles' => ['@'],
],
[
'actions' => ['index'],
'allow' => true,
'roles' => ['@'],
],
[
'actions' => ['home'],
'allow' => true,
'roles' => ['@'],
],
[
'actions' => ['contact'],
'allow' => true,
'roles' => ['@'],
],
[
'actions' => ['about'],
'allow' => true,
'roles' => ['@'],
],
],
],
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
'logout' => ['post'],
],
],
];
}
/**
* {@inheritdoc}
*/
public function actions()
{
return [
'error' => [
'class' => 'yii\web\ErrorAction',
],
'captcha' => [
'class' => 'yii\captcha\CaptchaAction',
'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null,
],
];
}
/**
* Displays homepage.
*
* @return mixed
*/
public function actionIndex()
{
if (!Yii::$app->user->isGuest) {
$this->layout = 'main';
return $this->render('home');
}
return $this->goHome();
}
/**
* Displays about page.
*
* @return mixed
*/
public function actionHome()
{
return $this->render('home');
}
/**
* Logs in a user.
*
* @return mixed
*/
public function actionLogin()
{
$this->layout = 'welcome';
if (!Yii::$app->user->isGuest) {
$this->layout = 'main';
return $this->render('home');
}
$model = new LoginForm();
if ($model->load(Yii::$app->request->post()) && $model->login()) {
$this->layout = 'main';
return $this->render('home');
}
else {
$model->password = '';
return $this->render('login', [
'model' => $model,
]);
}
}
/**
* Logs out the current user.
*
* @return mixed
*/
public function actionLogout()
{
Yii::$app->user->logout();
return $this->goHome();
}
/**
* Displays contact page.
*
* @return mixed
*/
public function actionContact()
{
$model = new ContactForm();
if ($model->load(Yii::$app->request->post()) && $model->validate()) {
if ($model->sendEmail(Yii::$app->params['adminEmail'])) {
Yii::$app->session->setFlash('success', 'Thank you for contacting us. We will respond to you as soon as possible.');
}
else {
Yii::$app->session->setFlash('error', 'There was an error sending your message.');
}
return $this->refresh();
}
else {
return $this->render('contact', [
'model' => $model,
]);
}
}
/**
* Displays about page.
*
* @return mixed
*/
public function actionAbout()
{
return $this->render('about');
}
/**
* Signs user up.
*
* @return mixed
*/
public function actionSignup()
{
$this->layout = 'welcome';
$model = new SignupForm();
if ($model->load(Yii::$app->request->post())) {
if ($user = $model->signup()) {
if (Yii::$app->getUser()->login($user)) {
$this->layout = 'main';
return $this->actionHome();
}
}
}
return $this->render('signup', [
'model' => $model,
]);
}
后端和后端控制器
/backend/.htacces
RewriteEngine on
#if directory or a file exist, use the request directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
#otherwise, forward to index.php
RewriteRule . index.php
/backend/config/main.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'],
'homeUrl' => '/administrator',
'modules' => [],
'components' => [
'request' => [
'csrfParam' => '_csrf-backend',
'baseUrl' => '/administrator',
],
'user' => [
'identityClass' => 'common\models\User',
'enableAutoLogin' => true,
'identityCookie' => ['name' => '_identity-backend', 'httpOnly' => true],
],
'session' => [
// this is the name of the session cookie used for login on the backend
'name' => 'advanced-backend',
],
'log' => [
'traceLevel' => YII_DEBUG ? 3 : 0,
'targets' => [
[
'class' => 'yii\log\FileTarget',
'levels' => ['error', 'warning'],
],
],
],
'errorHandler' => [
'errorAction' => 'site/error',
],
// main - used to generate and parse URLs to backend from backend app
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'baseUrl' => '/backend/web',
],
// slave - used to generate URLs to frontend from backend app
'urlManagerFrontend' => [
'class' => 'yii\web\urlManager',
'enablePrettyUrl' => true,
'showScriptName' => false,
'baseUrl' => '/',
'rules' => [
'/' => 'site/index',
'home' => 'site/home',
'about' => 'site/about',
'moje-prace' => 'site/moje-prace',
'umow-wizyte' => 'rezerwacje/create',
'contact' => 'site/contact',
'login' => 'site/login',
'signup' => 'site/signup',
],
],
'params' => $params,
];
/backend/controllers/SiteController.php
namespace backend\controllers;
use Yii;
use yii\web\Controller;
use yii\filters\VerbFilter;
use yii\filters\AccessControl;
use common\models\LoginForm;
/**
* Site controller
*/
class SiteController extends Controller
{
/**
* {@inheritdoc}
*/
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',
],
];
}
/**
* Displays homepage.
*
* @return string
*/
public function actionIndex()
{
return $this->render('index');
}
/**
* Login action.
*
* @return string
*/
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 {
$model->password = '';
return $this->render('login', [
'model' => $model,
]);
}
}
/**
* Logout action.
*
* @return string
*/
public function actionLogout()
{
Yii::$app->user->logout();
return $this->goHome();
}
}
VHOST & APACHE.CONF
apache2.conf
<Directory />
Options FollowSymLinks
AllowOverride All
Require all granted
</Directory>
<Directory /usr/share>
AllowOverride All
Require all granted
</Directory>
<Directory /home/user/project>
Options FollowSymLinks
AllowOverride All
Require all granted
</Directory>
vhost
<VirtualHost *:80>
ServerAdmin admin@prst.app
ServerName pp.test
DocumentRoot /home/user/project/pp/
<Directory "/home/user/project/pp/">
Options FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/pp__error.log
CustomLog ${APACHE_LOG_DIR}/pp_access.log combined
</VirtualHost>
我无法在视图中创建超链接或在控制器中从前端重定向到后端,以及从后端重定向到前端。
我假设您的前端位于 http://localhosts
,后端位于 http://localhosts/admin
。如果您的重写规则无法正常工作,您可以为此尝试
你总是有 2 个 UrlManager
组件:main(对于当前环境)和 slave(对于第二个环境,例如前端应用程序中的后端)。所以在 frontend/config/main.php
你会得到类似的东西:
// ...
// main - used to generate and parse URLs to frontend from frontend app
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'baseUrl' => '/',
'rules' => [
'/' => 'site/index',
'home' => 'site/home',
'about' => 'site/about',
'moje-prace' => 'site/moje-prace',
'umow-wizyte' => 'rezerwacje/create',
'contact' => 'site/contact',
'login' => 'site/login',
'signup' => 'site/signup',
],
],
// slave - used to generate URLs to backend from frontend app
'urlManagerBackend' => [
'class' => 'yii\web\urlManager',
'baseUrl' => '/admin',
'enablePrettyUrl' => true,
'showScriptName' => false,
],
// ...
并且在 backend/config/main.php
中:
// ...
// main - used to generate and parse URLs to backend from backend app
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'baseUrl' => '/admin',
],
// slave - used to generate URLs to frontend from backend app
'urlManagerFrontend' => [
'class' => 'yii\web\urlManager',
'enablePrettyUrl' => true,
'showScriptName' => false,
'baseUrl' => '/',
'rules' => [
'/' => 'site/index',
'home' => 'site/home',
'about' => 'site/about',
'moje-prace' => 'site/moje-prace',
'umow-wizyte' => 'rezerwacje/create',
'contact' => 'site/contact',
'login' => 'site/login',
'signup' => 'site/signup',
],
],
// ...
如您所见,它们已互换 - 前端应用程序中的主要 UrlManager
是后端应用程序中的从属应用程序。根据当前和目标环境,您使用不同的 URL 管理器。
如果你想从后端应用生成URL到前端:
Yii::$app->urlManagerFrontend->createUrl('site/index');
// result: http://localhost
如果你想从 backend app:
生成 URL 到 backendYii::$app->urlManager->createUrl('site/index');
// result: http://localhost/admin/site/index
如果你想从前端应用生成URL到后端:
Yii::$app->urlManagerBackend->createUrl('site/index');
// result: http://localhost/admin/site/index
如果你想从 frontend app:
生成 URL 到 frontendYii::$app->urlManager->createUrl('site/index');
// result: http://localhost
终于搞定了!在新的 yii2 advanced 上,我在前端和后端之间建立了连接,但是 "sides" 中的 pretty url 仍然存在问题。
后端/.htaccess
RewriteEngine on
#if directory or a file exist, use the request directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
#otherwise, forward to index.php
RewriteRule . index.php
backend/config/main.php
use \yii\web\Request;
$baseUrl = str_replace('/backend/web', '/backend/web', (new Request)->getBaseUrl());
$frontEndBaseUrl = str_replace('/backend/web', '/frontend/web', (new Request)->getBaseUrl());
$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'],
'modules' => [],
'components' => [
'request' => [
'csrfParam' => '_csrf-backend',
],
'user' => [
'identityClass' => 'common\models\User',
'enableAutoLogin' => true,
'identityCookie' => ['name' => '_identity-backend', 'httpOnly' => true],
],
'session' => [
// this is the name of the session cookie used for login on the backend
'name' => 'advanced-backend',
],
'log' => [
'traceLevel' => YII_DEBUG ? 3 : 0,
'targets' => [
[
'class' => 'yii\log\FileTarget',
'levels' => ['error', 'warning'],
],
],
],
'errorHandler' => [
'errorAction' => 'site/error',
],
// main - used to generate and parse URLs to backend from backend app
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'baseUrl' => '/backend/web',
],
// slave - used to generate URLs to frontend from backend app
'urlManagerFrontend' => [
'class' => 'yii\web\urlManager',
'enablePrettyUrl' => true,
'showScriptName' => false,
'baseUrl' => '/',
'rules' => [
'/' => 'site/index',
'home' => 'site/home',
'about' => 'site/about',
'moje-prace' => 'site/moje-prace',
'umow-wizyte' => 'rezerwacje/create',
'contact' => 'site/contact',
'login' => 'site/login',
'signup' => 'site/signup',
],
],
],
'params' => $params,
];
后端link前端
简单创建:
$frontendUrl= Yii::$app->urlManagerFrontend->createUrl('//');
echo yii\helpers\Html::a('link to frontend', $frontendUrl);
前端/.htaccess
RewriteEngine on
#if directory or a file exist, use the request directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
#otherwise, forward to index.php
RewriteRule . index.php
frontend/config/main.php
use \yii\web\Request;
$baseUrl = str_replace('/frontend/web', '/frontend/web', (new Request)->getBaseUrl());
$backEndBaseUrl = str_replace('/frontend/web', '/backend/web', (new Request)->getBaseUrl());
$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-frontend',
'basePath' => dirname(__DIR__),
'bootstrap' => ['log'],
'controllerNamespace' => 'frontend\controllers',
'components' => [
'request' => [
'csrfParam' => '_csrf-frontend',
],
'user' => [
'identityClass' => 'common\models\User',
'enableAutoLogin' => true,
'identityCookie' => ['name' => '_identity-frontend', 'httpOnly' => true],
],
'session' => [
// this is the name of the session cookie used for login on the frontend
'name' => 'advanced-frontend',
],
'log' => [
'traceLevel' => YII_DEBUG ? 3 : 0,
'targets' => [
[
'class' => 'yii\log\FileTarget',
'levels' => ['error', 'warning'],
],
],
],
'errorHandler' => [
'errorAction' => 'site/error',
],
// main - used to generate and parse URLs to frontend from frontend app
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'baseUrl' => $baseUrl,
'rules' => [
'/' => 'site/index',
'/home' => 'site/home',
'/about' => 'site/about',
'moje-prace' => 'site/moje-prace',
'umow-wizyte' => 'rezerwacje/create',
'contact' => 'site/contact',
'login' => 'site/login',
'signup' => '/site/signup',
],
],
// slave - used to generate URLs to backend from frontend app
'urlManagerBackend' => [
'class' => 'yii\web\urlManager',
'baseUrl' => $backEndBaseUrl,
'enablePrettyUrl' => false,
'showScriptName' => false,
],
],
'params' => $params,
];
前端 link 后端
简单创建:
$backendUrl= Yii::$app->urlManagerBackend->createUrl('//');
echo yii\helpers\Html::a('link to backend', $backendUrl);
在根目录中,什么意思 http://localhost/app-name/ 我创建了 index.php 文件用于重定向到前端,同时在后端(到前端)上单击 link:
/index.php
header("Location: http://pp.test/frontend/web/", true, 301);
exit();
现在它工作正常,但我无法在后端启用漂亮的 url,因为它不能正常工作。而且我不认为这是使用从其他文件尤其是从根目录重定向的好方法。
请注意,在 common/config/main.php 中不需要任何更改,也不需要根目录中的 .htaccess 文件。