Predvoditelev.RU
Заметки

Yii3 в подпапке домена

В большинстве случаев приложение доступно через корневую директорию домена, например https://example.com/. Но иногда требуется разместить приложение в подпапке, например https://example.com/application/. Для этого нужно выполнить несколько манипуляций:

  1. создать подпапку в корне домена;
  2. перенести файлы приложения, в том числе точку входа index.php, из корня в подпапку;
  3. изменить пути в перемещённых файлах;
  4. изменить пути в конфигурации приложения;
  5. настроить маршрутизацию с учётом подпапки.

Разберём подробнее на примере шаблона веб-приложения Yii3.

Исходные данные

Шаблон приложения без изменений и домен yii3app.test, указывающий на папку /public.

Требуется сделать доступным приложение по адресу yii3app.test/application.

Шаг 1. Создание подпапки

В папке /public создаём папку application.

Шаг 2. Перемещение файлов

Из папки /public переносим файлы и папки в подпапку /public/application:

  • точка входа index.php,
  • папка с ресурсами assets,
  • папка с изображениями images,
  • файл конфигурации веб-сервера .htaccess (если используется Apache).

Шаг 3. Изменение путей в перемещённых файлах

В нашем случае нужно изменить только пути к корневой папке в точке входа index.php с dirname(__DIR__) на dirname(__DIR__, 2):

<?php
...

// Раз
require_once dirname(__DIR__, 2) . '/autoload.php';

if (getenv('YII_ENV') === 'test') {
    // Два
    $c3 = dirname(__DIR__, 2) . '/c3.php';
    if (file_exists($c3)) {
        require_once $c3;
    }
}

// Run HTTP application runner
$runner = new HttpApplicationRunner(
    // Три
    dirname(__DIR__, 2), 
    $_ENV['YII_DEBUG'],
    $_ENV['YII_ENV']
);
$runner->run();

Шаг 4. Изменение путей в конфигурации приложения

В шаблоне приложения нужно исправить только псевдоним пути к папке с ресурсами. Открываем параметры /config/params.php и вносим изменение:

'yiisoft/aliases' => [
    'aliases' => [
      ...
      '@assets' => '@root/public/application/assets',
      ...
    ],
],

Шаг 5. Настройка маршрутизации

Здесь есть несколько путей: настроить маршрутизацию вручную или использовать мидлварь SubFolder из пакета Yii Middleware. Рассмотрим оба варианта.

Вариант 1. Ручная настройка маршрутизации

Изменяем псевдоним базового URL в параметрах приложениях /config/params.php:

'yiisoft/aliases' => [
    'aliases' => [
      ...
      '@baseUrl' => '/application/',
      ...
    ],
],

... и в конфигурации маршрутов /config/routes.php оборачиваем все маршруты в группу с префиксом:

return [
    Group::create('/application')
        ->routes(
            Route::get('/')->action([SiteController::class, 'index'])->name('home'),
        ),
];

Вариант 2. Использование мидлвари SubFolder

Мидлварь SubFolder из пакета Yii Middleware позволяет автоматически убрать префикс из запроса, настроить генерацию URL и псевдоним пути. 

Для использования мидлвари достаточно добавить её в список мидлварей в параметрах приложения в файле /config/params.php. Но лучше её дополнительно сконфигурировать, указав префикс (тем самым мы улучшаем производительность, так как мидлваре не придётся самой определять префикс) и псевдоним базового URL, в который нужно записать префикс (это позволит не делать этого вручную, как в предыдущем варианте):

'middlewares' => [
    ErrorCatcher::class,
    SessionMiddleware::class,
    static function (UrlGeneratorInterface $urlGenerator, Aliases $aliases) {
        return new SubFolder(
            $urlGenerator,
            $aliases,
            '/application',
            '@baseUrl',
        );
    },
    Router::class,
],

При написании статьи использовались следующие пакеты:

  • Yii Application Template rev. 3d2fd14
  • Yii Middleware rev. 59d6066
@sergei_predvoditelev — Авторский канал в Telegram: заметки о веб-разработке, PHP, открытом ПО, развитии и немного о жизни.