Yii2 htaccess - Как скрыть интерфейс / веб и бэкэнд / веб ПОЛНОСТЬЮ
Я думаю, что я довольно близко. У меня есть htaccess, перенаправляющий на веб-сайт (frontend/web) и /admin
дорожка (backend/web
). Сайт выглядит нормально, загрузка CSS файлов и т. Д.
Если вы перейдете по адресу: http://localhost/yii2app/ - он загружает домашнюю страницу и не перенаправляет в адресную строку, но на странице отображается веб-интерфейс / web во всех URL-адресах.
если вы идете по адресу: http://localhost/yii2app/admin - он загружает страницу входа в бэкэнд, однако он сразу же перенаправляет в / backend / web / site / login в адресной строке (безобразно).
Проблема: frontend/backend
пути отображаются в URL-адресах (адресная строка и ссылки на странице).
Что мне нужно: я хочу, чтобы весь сайт работал без показа внешних / внутренних ссылок. Корень проекта должен тянуть (невидимо) из frontend/web
без показа.. Так что http://localhost/yii2app/ запускает весь мой интерфейс, а http://localhost/yii2app/admin/ запускает весь мой бэкэнд.
Зачем? Я чувствую, что эта установка будет довольно солидной и элегантной, когда вы живете на сервере Я хочу, чтобы моя папка проекта работала на сайте, и она прекрасно работала, без необходимости работать с локальным сервером.
.htaccess
файл в /yii2app
реж:
Options -Indexes
RewriteEngine on
<IfModule mod_rewrite.c>
RewriteCond %{REQUEST_URI} !^/backend/web/(assets|css)/
RewriteCond %{REQUEST_URI} admin
RewriteRule .* backend/web/index.php [L]
RewriteCond %{REQUEST_URI} !^/(frontend|backend)/web/(assets|css)/
RewriteCond %{REQUEST_URI} !admin
RewriteRule .* frontend/web/index.php [L]
</IfModule>
Теперь в веб-каталогах frontend и backend они имеют одинаковые .htaccess
:
RewriteEngine on
# if a directory or a file exists, use the request directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# otherwise forward the request to index.php
RewriteRule . index.php
Я не хочу видеть /frontend/web
или же /backend/web
Когда-либо:)
Я попытался поиграть с RewriteRule в htaccess рута, чтобы добавить /admin
на URL, но он продолжал говорить мне /admin
не существует. Я ЗНАЮ, что это не существует, и я не хочу, чтобы это существовало. Я хочу, чтобы это был относительный путь.. т.е.: /admin == /backend/web.
Адрес по-другому. Я все пути в корне проекта ( http://localhost/yii2app/), чтобы загрузить frontend/web
, но не показывая этого. Кроме того, http://localhost/yii2app/admin для загрузки backend/web
и просто показывает http://localhost/yii2app/admin. Очевидно, они будут иметь свои controller/action
прилагается к ним. Таким образом, администратор может выглядеть как http://localhost/yii2app/admin/site/login
ПРИМЕЧАНИЕ: я не играл ни с одним из файлов. Это стандартная расширенная настройка yii2 с использованием composer и следования документации. Пока я играл только с файлами htaccess.
Спасибо!
6 ответов
Если ваша единственная цель - не видеть /frontend/web
или же /backend/web
, даже не используя правила.htaccess, вы можете пойти на следующее:
Почему бы просто не вытащить содержимое web
папки и поместить их в корень? Просто настройте путь, ссылаясь на фреймворк и конфигурационные файлы в скриптах входа index.php
,
Ваша структура dir будет выглядеть так:
- yii2app/
- frontend/
- backend/
- common/
- .. other folders..
- admin/
- assets/
- css/
- index.php
- assets/
- css/
- index.php
Ваш yii2app/index.php
будет выглядеть так:
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev');
require(__DIR__ . '/vendor/autoload.php');
require(__DIR__ . '/vendor/yiisoft/yii2/Yii.php');
require(__DIR__ . '/common/config/bootstrap.php');
require(__DIR__ . '/frontend/config/bootstrap.php');
$config = yii\helpers\ArrayHelper::merge(
require(__DIR__ . '/common/config/main.php'),
require(__DIR__ . '/common/config/main-local.php'),
require(__DIR__ . '/frontend/config/main.php'),
require(__DIR__ . '/frontend/config/main-local.php')
);
$application = new yii\web\Application($config);
$application->run();
и ваш yii2app/admin/index.php
будет выглядеть так:
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev');
require(__DIR__ . '/../vendor/autoload.php');
require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php');
require(__DIR__ . '/../common/config/bootstrap.php');
require(__DIR__ . '/../backend/config/bootstrap.php');
$config = yii\helpers\ArrayHelper::merge(
require(__DIR__ . '/../common/config/main.php'),
require(__DIR__ . '/../common/config/main-local.php'),
require(__DIR__ . '/../backend/config/main.php'),
require(__DIR__ . '/../backend/config/main-local.php')
);
$application = new yii\web\Application($config);
$application->run();
РЕДАКТИРОВАТЬ: ваши сценарии ввода могут выглядеть иначе, чем мои, но вы должны получить представление об изменении путей, чтобы найти файлы инфраструктуры с этими примерами.
Попробуйте это с помощью метода.htaccess
Шаг 1
Создайте файл.htaccess в корневой папке, т.е. advanced/.htaccess
и напишите ниже код.
Options +FollowSymlinks
RewriteEngine On
# deal with admin first
RewriteCond %{REQUEST_URI} ^/(admin) <------
RewriteRule ^admin/assets/(.*)$ backend/web/assets/$1 [L]
RewriteRule ^admin/css/(.*)$ backend/web/css/$1 [L]
RewriteCond %{REQUEST_URI} !^/backend/web/(assets|css)/ <------
RewriteCond %{REQUEST_URI} ^/(admin) <------
RewriteRule ^.*$ backend/web/index.php [L]
RewriteCond %{REQUEST_URI} ^/(assets|css) <------
RewriteRule ^assets/(.*)$ frontend/web/assets/$1 [L]
RewriteRule ^css/(.*)$ frontend/web/css/$1 [L]
RewriteRule ^js/(.*)$ frontend/web/js/$1 [L]
RewriteRule ^images/(.*)$ frontend/web/images/$1 [L]
RewriteCond %{REQUEST_URI} !^/(frontend|backend)/web/(assets|css)/ <------
RewriteCond %{REQUEST_URI} !index.php
RewriteCond %{REQUEST_FILENAME} !-f [OR]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ frontend/web/index.php
Примечание: если вы пытаетесь на локальном сервере, замените ^/
с ^/project_name/
где вы видите стрелку знак. Удалить эти стрелки <------
после настройки
Шаг 2
Теперь создайте components/Request.php
файл в общем каталоге и напишите ниже код в этом файле.
namespace common\components;
class Request extends \yii\web\Request {
public $web;
public $adminUrl;
public function getBaseUrl(){
return str_replace($this->web, "", parent::getBaseUrl()) . $this->adminUrl;
}
/*
If you don't have this function, the admin site will 404 if you leave off
the trailing slash.
E.g.:
Wouldn't work:
site.com/admin
Would work:
site.com/admin/
Using this function, both will work.
*/
public function resolvePathInfo(){
if($this->getUrl() === $this->adminUrl){
return "";
}else{
return parent::resolvePathInfo();
}
}
}
Шаг 3
Установка компонента. Напишите ниже код в frontend/config/main.php
а также backend/config/main.php
файлы соответственно.
//frontend, under components array
'request'=>[
'class' => 'common\components\Request',
'web'=> '/frontend/web'
],
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
],
// backend, under components array
'request'=>[
'class' => 'common\components\Request',
'web'=> '/backend/web',
'adminUrl' => '/admin'
],
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
],
Шаг 4 (необязательно, если не работает до третьего шага)
создать файл.htaccess в веб-каталоге
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?/$1 [L]
Примечание: убедитесь, что вы включили переписывание вашего мода в apache
Это оно! Вы можете попробовать свой проект с www.project.com/admin
, www.project.com
на локальном сервереlocalhost/project_name/admin
, localhost/project_name
Как сказал @deacs, просто переместите файлы из frontend / web в yii2app (корневая папка) и создайте папку в yii2app "admin", переместите файлы из backend/web в yii2app / admin и затем создайте файлы.htaccess в admin и yii2app с помощью следующий код:
Options +FollowSymLinks
IndexIgnore */*
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
Затем добавьте / измените компонент urlManager в файле конфигурации main.php в файлах frontend / config / main.php и backend/config/main.php со следующим кодом:
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'enableStrictParsing' => false,
'rules' => [
],
],
Затем измените index.php в yii2app с помощью следующего кода:
<?php
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev');
require(__DIR__ . '/vendor/autoload.php');
require(__DIR__ . '/vendor/yiisoft/yii2/Yii.php');
require(__DIR__ . '/common/config/bootstrap.php');
require(__DIR__ . '/frontend/config/bootstrap.php');
$config = yii\helpers\ArrayHelper::merge(
require(__DIR__ . '/common/config/main.php'),
require(__DIR__ . '/common/config/main-local.php'),
require(__DIR__ . '/frontend/config/main.php'),
require(__DIR__ . '/frontend/config/main-local.php')
);
$application = new yii\web\Application($config);
$application->run();
Также измените index.php в yii2app / admin с помощью следующего кода:
<?php
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev');
require(__DIR__ . '/../vendor/autoload.php');
require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php');
require(__DIR__ . '/../common/config/bootstrap.php');
require(__DIR__ . '/../backend/config/bootstrap.php');
$config = yii\helpers\ArrayHelper::merge(
require(__DIR__ . '/../common/config/main.php'),
require(__DIR__ . '/../common/config/main-local.php'),
require(__DIR__ . '/../backend/config/main.php'),
require(__DIR__ . '/../backend/config/main-local.php')
);
$application = new yii\web\Application($config);
$application->run();
Вот и все, что вам нужно для создания SEO-дружественных URL в yii2. Я боролся с собой, а потом получил ответ от @deacs и подумал, что, может быть, это кому-нибудь поможет.
После 2 дней поиска лучших решений я делаю это так (хост на виртуальном хостинге). Я делаю поддомен admin.xxxxx.com
и укажите его на корень документа /public_html/xxxxxx/backend/web
Поскольку виртуальный хостинг не позволяет вам установить пользовательский корень документа для основного домена, я использую это решение:
Измените имя основного домена в своей учетной записи, затем добавьте старый основной домен в качестве домена расширения. Таким образом, вы можете выбрать желаемую корневую папку для основного домена / нового домена расширения. (Новый основной домен теперь будет указывать на public_html.)
Затем укажите (теперь мой аддон-домен) на правый корень документа для внешнего интерфейса./public_html/xxxxxx/frontend/web
На данный момент самым простым и гибким решением для меня являются символические ссылки. Вы можете разместить проект где угодно и создавать только символические ссылки на каталоги, вынужденные вашим хостингом. Например, положить проект в ~/domains/example.com/project
и создать символические ссылки на public_html
каталог.
cd ~/domains/example.com
# remove old public_html directory
mv public_html old_public_html
# create symlink for fronted
ln -s ./project/frontend/web public_html
# create symlink for backend in /admin subdirectory
ln -s ./project/backend/web public_html/admin
И там у вас есть http://example.com/
с интерфейсом и http://example.com/admin/
с бэкэндом.
Если вам нужен сервер в отдельном домене (admin.example.com
):
ln -s ~/domains/example.com/project/backend/web ~/domains/admin.example.com/public_html
Pros
- Нет переписанных правил переписки, которые почти никто не понимает.
- У вас нет целого проекта в общедоступном каталоге, поэтому некоторая неправильная конфигурация веб-сервера и / или PHP не будет публиковать ваш код и файлы конфигурации.
- Вы можете адаптировать проект под любую структуру, необходимую для хостинга.
- Если вы используете относительные символические ссылки, вы можете держать их под контролем версий и создать единый веб-корень со всеми приложениями в качестве подкаталогов.
Cons
- Если у вас есть хостинг с некоторыми ограничениями
open_basedir
настройки без какого-либо контроля над ним, вы можете не использовать его.
Поместите .htaccess в веб-каталог
код
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
Я последовал за ответом "deacs" и получил следующую ошибку
Invalid Configuration – yii\base\InvalidConfigException
The directory does not exist: D:/wamp/www/yii2app/assets
Затем я создал папку "активы" в "yii2app", и он работает
---------- Второй метод ------------------------
Без перемещения файлов вы можете перейти по следующей ссылке
https://github.com/yiisoft/yii2-app-advanced/blob/master/docs/guide/start-installation.md
---------- Третий метод -----------------------------
http://www.yiiframework.com/doc-2.0/guide-tutorial-shared-hosting.html