Reputation: 103
I'm trying to completely manage my page with .htaccess
file and two links/button or redirect:
Hope that is clearly enough.
My environment is DEV as I'm working localy if that is so difference.
All I tried:
And I'm a bit confused with .htaccess
files and urlManager
so appreciate any help a lot.
Let's check the files :
/.htacces
#prevent directory listing
Options -Indexes
IndexIgnore */*
#follow symbolic links
Options FollowSymlinks
RewriteEngine on
RewriteRule ^admin(/.+)?$ backend/web/$1 [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();
}
}
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 [email protected]
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>
I can not create the hyperlink in a view or redirect in controller from frontend to backend, and from backend to frontend.
Upvotes: 0
Views: 2674
Reputation: 103
Finally it's done ! On the fresh yii2 advanced i set up connections between frontend and backend, but still have a problem with pretty url in both "sides".
backend/.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,
];
simply created with:
$frontendUrl= Yii::$app->urlManagerFrontend->createUrl('//');
echo yii\helpers\Html::a('link to frontend', $frontendUrl);
frontend/.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,
];
simply created with:
$backendUrl= Yii::$app->urlManagerBackend->createUrl('//');
echo yii\helpers\Html::a('link to backend', $backendUrl);
In the root directory what means http://localhost/app-name/ i created index.php file for redirecting to frontend while clicking link on backend (to frontend):
/index.php
header("Location: http://pp.test/frontend/web/", true, 301);
exit();
And by now it works so so, but i'm not able to enable pretty url in the backend as it does not works corectlly. And also i do not think that's a good way using redirecting from other file especially from root directory.
Please note, that in common/config/main.php no changes is needed and do not need .htaccess file in the root directory.
Upvotes: 0
Reputation: 22174
I'm assuming that your frontend is at http://localhosts
and your backend at http://localhosts/admin
. If your rewrite rules does not work correctly, you may try use symlinks for this - at least for me it was always simpler and less problematic way of handling frontend/backend URLs on shared hosting.
You always have 2 UrlManager
components: main (for current environment) and slave (for second environment, for example for backend in frontend app). So in frontend/config/main.php
you will have something like:
// ...
// 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,
],
// ...
And in 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',
],
],
// ...
As you can see, they're swapped - main UrlManager
from frontend app is slave in backend app. Depending on current and target environment, you're using different URL manager.
If you want to generate URL to frontend from backend app:
Yii::$app->urlManagerFrontend->createUrl('site/index');
// result: http://localhost
If you want to generate URL to backend from backend app:
Yii::$app->urlManager->createUrl('site/index');
// result: http://localhost/admin/site/index
If you want to generate URL to backend from frontend app:
Yii::$app->urlManagerBackend->createUrl('site/index');
// result: http://localhost/admin/site/index
If you want to generate URL to frontend from frontend app:
Yii::$app->urlManager->createUrl('site/index');
// result: http://localhost
Upvotes: 0