Файл .htaccess для сайта на Yii2 под VestaCP

Нашел работающую конфигурацию .htaccess для сайта на Yii2 basic шаблона при работе с бесплатной панелью управления хостингом VestaCP. Это, наверное, самый быстрый способ заставить работать сайт, учитывая, что требования к root-директории фреймворка и панели различаются от слова совсем.

Очень нравится использовать в работе панель управления хостингом VestaCP и очень нравится разработка на yii2-фреймворке. Свои творения выкладываю на VDS-сервер, где установлена вышеназванная панель. В свое время пришлось разобраться, какие директивы необходимо внести в конфигурационный файл .htaccess веб-сервера apache, что прописать в настройках конфигурации сайта, чтобы и сайт заработал и, так необходимые для SEO, ЧПУ радовали глаз в адресной строке браузера. Приведу пример данного решения.

Структура папок домена, созданного с помощью Весты имеет следующий вид (упрощенно):

web
  example.com
    cgi-bin
    ...
    public_html
    public_shtml

Файлы сайта размещаются или в public_html или в public_shtml, в зависимости от того, что вы указали в настройках при создании домена.

Шаблон yii2-basic я размещаю в public_html. Упрощенно он имеет вид:

public_html
  assets
  config
  controllers
  models
  ...
  web
  ...
  
  

Таким образом, document root для панели является public_html, а для фреймворка - каталог web (на второй структуре дирейторий). Поскольку в корне сайта нет индексного файла, то его в браузере мы не увидим.

Для того, чтобы все это дело заработало, создаем .htaccess в каталоге public_html со следующим содержимым (первый файл):

Options +FollowSymLinks
IndexIgnore */*
RewriteEngine on

RewriteBase /

RewriteCond %{HTTP_HOST} ^example\.com$
RewriteCond %{REQUEST_URI} !^/(web)
RewriteRule ^assets/(.*)$ /web/assets/$1 [L]
RewriteRule ^css/(.*)$ /web/css/$1 [L]
RewriteRule ^js/(.*)$ /web/js/$1 [L]
RewriteRule (.*) /web/$1  [L,QSA]


RewriteCond %{REQUEST_URI} ^/web
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /web/index.php

Как видно, мы еще уточняем правила для каталогов внутри web фреймворка (assets, css, js). Укажите правила в соответствии с вашей необходимостью (может быть images или img).

Создаем второй .htaccess внутри директории web (директории web-root фреймворка):

RewriteEngine On RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule . index.php

Таким образом структура сайта примет вид:

public_html
  assets
  config
  controllers
  models
  ...
  web
      assets
      css
      js
      ...
      .htaccess (второй файл)
      index.php
  ...
  .htaccess (первый файл)

В конфигурационном файле сайта web.php настраиваем компоненты request и UrlManager:

'components' => [
        ...
        'request' => [
            'baseUrl' => '',
            ...
        ],
        'urlManager' => [
                    'enablePrettyUrl' => true,
                    'showScriptName' => false,
                    'rules' => [
                        '' => 'site/index',
                        'site/<action:\w+>'=>'site/<action>',
                        ...
                    ],
        ],
        ...
],

Проверяем работу сайта.

Панель VestaCP позволяет использовать бесплатный ssl-сертификат от Let's Encrypt. Настроить редирект на https можно, добавив в первый .htaccess:

Options +FollowSymLinks
IndexIgnore */*
RewriteEngine on

RewriteBase /

RewriteCond %{SERVER_PORT} !^443$
RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
RewriteCond %{HTTP_HOST}  ^www\.(.+)$  [NC]
RewriteRule ^(.*)         https://%1/$1 [L,R=301]

RewriteCond %{HTTP_HOST} ^example\.com$
RewriteCond %{REQUEST_URI} !^/(web)
RewriteRule ^assets/(.*)$ /web/assets/$1 [L]
RewriteRule ^css/(.*)$ /web/css/$1 [L]
RewriteRule ^js/(.*)$ /web/js/$1 [L]
RewriteRule (.*) /web/$1  [L,QSA]


RewriteCond %{REQUEST_URI} ^/web
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /web/index.php

 

Александр Ляхович

Александр Ляхович

Автор "Блога из ломтиков. Заметки продолжающего веб-разработчика". Системный администратор, продолжающий web-разработчик, радиоинженер. Более 7 лет занимаюсь сайтостроением и изучаю данную область.