Yii2. Как убрать web из адреса

20.04.2019

Теги: .htaccessApacheFastCGIphp.iniSEOURLWeb-разработкаYii2ТеорияФреймворкЧПУ

Сразу после установки Yii2 сайт доступен по адресу server.com/web, поскольку именно в директории web находится публичная часть приложения. При попытке обратиться к корню сервера, убрав web из адреса, будет показан листинг корневой папки (если показ листинга не запрещен настройками сервера).

Такой вариант вряд ли кому-то понравится, хотелось бы, чтобы главная страница сайта была доступна при обращении к доменному имени, без добавления туда директории web. Сделать это достаточно просто. И для этого есть два способа.

Изменяем DocumentRoot

Первый, и самый правильный — изменить корневую директорию в настройках веб-сервера так, чтобы та указывала на web. У меня PHP установлен как FastCGI, и для каждого виртуального хоста в httpd-vhosts.conf задан свой php.ini:

#
#   Виртуальный хост localhost25
#
<VirtualHost *:80>
    ServerAdmin admin@localhost25
    ServerName localhost25
    DocumentRoot "D:/work/localhost25/www"
    ServerAlias host25.ru www.host25.ru
    # Переопределяем PHPRC, чтобы у хоста был свой php.ini
    FcgidInitialEnv PHPRC "D:/work/localhost25"
    ErrorLog D:/work/localhost25/error.log
    CustomLog D:/work/localhost25/access.log common
</VirtualHost>

Здесь нужно изменить только одну строку:

DocumentRoot "D:/work/localhost25/www/web"

И отредактирвать php.ini для этого виртуального хоста:

; The root of the PHP pages, used only if nonempty.
; if PHP was not compiled with FORCE_REDIRECT, you SHOULD set doc_root
; if you are running php as a CGI under any web server (other than IIS)
; see documentation for security issues.  The alternate is to use the
; cgi.force_redirect configuration below
; http://php.net/doc-root
doc_root = "d:/work/localhost25/www"
doc_root = "d:/work/localhost25/www/web"

Добавляем .htaccess

Второй способ — создаем файл .htaccess в корне сайта и добавляем в него две строчки кода:

RewriteEngine on
RewriteRule ^(.+)?$ /web/$1

Первая строка включает модуль mod_rewrite, с помощью которого можно управлять адресами. А вторая — полученный запрос перенаправляет в директорию web.

Человекопонятные URL

Создаем файл .htaccess в директории web и добавляем в него четыре строчка кода:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php

Здесь мы говорим, что если запрос не идет к реально существующему файлу или каталогу (например, js-скрипт или изображение), тогда его нужно перенаправить на файл index.php.

Теперь осталось добавить в файл конфигурации config/web.php настройку baseUrl и раскомментировать настройки компонента UrlManager:

<?php
$params = require(__DIR__ . '/params.php');

$config = [
    /*.....*/
    'components' => [
        /*.....*/
        'request' => [
            'baseUrl' => '',
            'cookieValidationKey' => '.....',
        ],
        'urlManager' => [
            // включаем поддержку SEF URL
            'enablePrettyUrl' => true,
            // не добавлять в URL index.php
            'showScriptName' => false,
            // правила преобразования адресов
            'rules' => [],
        ],
        /*.....*/
    ],
    'params' => $params,
];

return $config;

Теперь страницы сайта доступны по URL:

  • server.com/site/about
  • server.com/site/contact
  • server.com/site/login

Чтобы избавиться от site в URL, добавим несколько правил преобразования адресов:

<?php
$params = require(__DIR__ . '/params.php');

$config = [
    'id' => 'basic',
    /*.....*/
    'components' => [
        /*.....*/
        'request' => [
            'baseUrl' => '',
            'cookieValidationKey' => '.....',
        ],
        'urlManager' => [
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'rules' => [
                'about' => 'site/about',
                'contact' => 'site/contact',
                'login' => 'site/login',
            ],
        ],
        /*.....*/
    ],
    'params' => $params,
];

return $config;

Теперь страницы сайта доступны по URL:

  • server.com/about
  • server.com/contact
  • server.com/login

Добавлять правила для каждой страницы не очень удобно, но можно сделать так:

'rules' => [
    '<action:(about|contact|login)>' => 'site/<action>',
],

Или даже так:

'rules' => [
    '<action:[-a-zA-Z0-9_]+>' => 'site/<action>',
],

Дополнительно

Поиск: Apache • FastCGI • php.ini • URL • Web-разработка • Yii2 • Фреймворк • .htaccess • SEF • ЧПУ • SEO

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.