Yii2 htaccess – Как скрыть интерфейс / web и бэкэнд / web ПОЛНОСТЬЮ

Я думаю, что я довольно близко. У меня есть htaccess, перенаправляющий на веб-сайт (frontend / web) и путь /admin ( backend/web ). Сайт выглядит отлично, загрузка файлов CSS и т. Д.

Если вы перейдете к: http: // localhost / yii2app / – он загружает главную страницу и не перенаправляет адресную строку, но на странице отображается интерфейс / веб-адрес во всех URL-адресах.

если вы переходите к: http: // localhost / yii2app / admin – он загружает страницу входа в систему, однако сразу же перенаправляет на / backend / web / site / login в адресной строке (уродливо).

Проблема. В URL-адресах (адресная строка и ссылки на странице) отображаются frontend/backend пути.

Что мне нужно: я хочу, чтобы весь сайт работал без отображения интерфейсных / бэкэнд-ссылок. Корень проекта должен вытащить (невидимо) из frontend/web не показывая его. Таким образом, http: // localhost / yii2app / запускает весь мой интерфейс, а http: // localhost / yii2app / admin / запускает весь мой бэкэнд.

Зачем? Я чувствую, что эта настройка будет довольно прочной и элегантной, когда вы будете жить на сервере. Я хочу иметь возможность подталкивать мою папку проекта в реальном времени на сайт, и она работает нормально, без необходимости иметь хаки для обработки локального vs-сервера.

.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> 

Теперь в интерфейсных и бэкэндовых веб-каталогах оба они имеют одинаковый .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 не существует. Я ЗНАЮ, что этого не существует, и я не хочу, чтобы он существовал. Я хочу, чтобы это был относительный путь .. ie: / 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, использующая композитор и следуя документам. Единственное, что я играл до сих пор, – это файлы htaccess.

Спасибо!

Если вашей единственной целью является достижение никогда не просмотра /frontend/web или /backend/web , даже без использования правил .htaccess, вы можете пойти на следующее:

Почему бы просто не вытащить содержимое web папок и разместить их в корне? Просто отредактируйте путь, относящийся к файлам фреймворка и конфигурации в сценариях index.php .

Ваша структура будет выглядеть так:

 - yii2app/ - frontend/ - backend/ - common/ - .. other folders.. - admin/ - assets/ - css/ - index.php - assets/ - css/ - index.php 

yii2app/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(); 

EDIT: ваши сценарии ввода могут отличаться от моих, но вы должны получить представление об изменении путей, чтобы найти файлы фреймов с этими примерами.

Попробуйте это с помощью .htaccess Method-

Шаг 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. Eg: 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, просто переместите файлы из интерфейса / web в yii2app (корневую папку) и создайте папку в yii2app «admin» и переместите файлы из бэкэнда / веб-сайта в 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(); 

Это все, что вам нужно для создания URL-адресов, оптимизированных для SEO, в yii2. Я боролся с собой, а затем получил помощь от ответа @deacs, и хотя, возможно, это поможет кому-то.

После 2 дней поиска лучших решений я делаю это так (хост на общем хостинге). Я делаю субдомен admin.xxxxx.com и указываю его на документ root /public_html/xxxxxx/backend/web
Поскольку общий хостинг не позволяет размещать собственный корневой каталог для основного домена, я использую это решение:

Измените основное имя домена в своей учетной записи, а затем добавьте старый основной домен в качестве домена аддона. Таким образом, вы можете выбрать корневую папку для основного домена / нового домена аддона. (Новый основной домен теперь укажет на public_html.)

Затем укажите (теперь мой домен аддона) на правый корень документа для интерфейса /public_html/xxxxxx/frontend/web

Я последовал за ответом «deacs» и получил следующую ошибку

 Invalid Configuration – yii\base\InvalidConfigException The directory does not exist: D:/wamp/www/yii2app/assets 

то я создал папку «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