Подтвердить что ты не робот

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.

Спасибо!

4b9b3361

Ответ 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

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

Cons

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