it-swarm.com.ru

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/ run весь мой бэкэнд.

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

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

Теперь в веб-каталогах 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.

Спасибо!

28
Wade

Если ваша единственная цель - не видеть /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();

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

25
deacs

Попробуйте это с помощью метода .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

28
mohit

Как сказал @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, и я подумал, что, возможно, это кому-нибудь поможет.

3
shivgre

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

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

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

1
despotbg

На данный момент самым простым и гибким решением для меня являются символические ссылки . Вы можете разместить проект в любом месте и создавать только символические ссылки на каталоги, созданные вашим хостингом. Например, поместите проект в ~/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

  1. Нет переписанных правил переписки, которые почти никто не понимает.
  2. У вас нет всего проекта в общедоступном каталоге, поэтому некоторая неправильная конфигурация веб-сервера и/или PHP не будет публиковать ваш код и файлы конфигурации.
  3. Вы можете адаптировать проект под любую структуру, необходимую для хостинга. 
  4. Если вы используете относительные символические ссылки, вы можете держать их под контролем версий и создать единый веб-корень со всеми приложениями в качестве подкаталогов.

Cons

  1. Если у вас есть хостинг с некоторыми ограниченными настройками open_basedir без какого-либо контроля над ним, вы можете не использовать его.
0
rob006

Я последовал за ответом "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

0
Aamir Sarwar