Нашел работающую конфигурацию .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