Yii2 htaccess - Как скрыть интерфейс /web и бэкэнд /web ПОЛНОСТЬЮ
Я думаю, что я довольно близко. Я перенаправляю htaccess на веб-сайт (frontend/web) и путь /admin
(backend/web
). Сайт выглядит отлично, загрузка файлов CSS и т.д.
Если вы переходите к: http://localhost/yii2app/ - он загружает домашнюю страницу и не перенаправляет ее в адресную строку, но на странице отображается интерфейс/сеть во всех URL.
если вы перейдете к: http://localhost/yii2app/admin - он загружает страницу входа в систему, однако она сразу же перенаправляет на /backend/web/site/login в адресной строке (некрасиво).
Проблема: пути frontend/backend
отображаются в URL-адресах (адресная строка и ссылки на странице).
Что мне нужно: я хочу, чтобы весь сайт работал без отображения интерфейсных/бэкэнд-ссылок. Корень проекта должен вытащить (невидимо) из frontend/web
, не показывая его. Итак http://localhost/yii2app/ запускает весь мой интерфейс и http://localhost/yii2app/admin/ работает весь мой сервер.
Почему? Я чувствую, что эта настройка будет довольно прочной и элегантной, когда вы будете жить на сервере. Я хочу, чтобы иметь возможность подталкивать мою папку проекта в реальном времени на сайт, и она работает отлично, без необходимости иметь хаки для обработки локального сервера vs.
.htaccess
файл в /yii2app
dir:
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.
Спасибо!
Ответы
Ответ 1
Если ваша единственная цель - не видеть /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
будет выглядеть так:
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: ваши сценарии ввода могут отличаться от моих, но вы должны получить представление об изменении путей для поиска файлов фреймов с этими примерами.
Ответ 2
Попробуйте это с помощью .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.
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
Ответ 3
Как и @deacs, просто переместите файлы из интерфейса /web в yii2app (корневую папку) и создайте папку в yii2app "admin" и переместите файлы из бэкэнда/веб-сайта в yii2app/admin, а затем создайте файлы .htaccess в обоих администраторах и 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, и я, возможно, это поможет кому-то.
Ответ 4
После 2 дней поиска лучших решений я делаю это так (хост на общедоступном хостинге).
Я делаю субдомен admin.xxxxx.com
и указываю его на документ root /public_html/xxxxxx/backend/web
Поскольку общий хостинг не позволяет размещать собственный корневой каталог для основного домена, я использую это решение:
Измените основное имя домена в своей учетной записи, затем добавьте старый основной домен в качестве домена аддона. Таким образом, вы можете выбрать корневую папку для основного домена/нового домена аддона. (Новый основной домен теперь укажет на public_html.)
Затем укажите (теперь мой домен аддона) в правый корень документа для интерфейса
/public_html/xxxxxx/frontend/web
Ответ 5
Я последовал за ответом "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
Ответ 6
Пока что самое легкое и самое гибкое решение для меня - символические ссылки. Вы можете размещать проект где угодно и создавать символические ссылки на каталоги, созданные вашим хостингом. Например, поместите проект в ~/domains/example.com/project
и создайте символические public_html
каталог 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
без какого-либо контроля над ним, вы не сможете его использовать.