- Основной шаблон
- Скрыть веб-папку
- Расширенный шаблон
- Ссылки с бэкэнда на фронтэнд
- Конечный слеш
- Конфигурирование Apache напрямую
- Правила
Наша команда-партнер Artmisto
В этом руководстве представлены некоторые сведения о конфигурации Apache и Yii2, чтобы получить удобные для пользователя и дружественные для поисковых систем URL-адреса для вашего веб-приложения.
Основной шаблон
Официальный Yii2 документация есть страница о конфигурации Shared Hosting, которая предоставляет пример того, как вы можете настроить Apache для SEO-дружественных URL-адресов, используя файл .htaccess.
Options + FollowSymLinks IndexIgnore * / * RewriteEngine для #, если каталог или файл существует, использовать его напрямую. RewriteCond% {REQUEST_FILENAME}! -F RewriteCond% {REQUEST_FILENAME}! -D #, иначе перенаправить его в index.php RewriteRule. index.phpПосле этого вам нужно настроить urlManager в вашем файле config / web.php.
$ config = [// ... 'component' => ['urlManager' => ['class' => 'yii \ web \ UrlManager', 'showScriptName' => false, 'enablePrettyUrl' => true,], // ...Если ваше приложение находится в корневой папке, маршруты будут выглядеть примерно так: http://yourdomain.com/web/site/index, в противном случае, если ваше приложение Yii2 находится в подпапке, оно может выглядеть следующим образом : http: // yourdomain .com / app / web / site / index .
Скрыть веб-папку
Вы можете избавиться от веб- части URL-адреса, переместив все файлы из веб-папки в корневую папку ваших приложений и изменив пути в index.php, но этот метод смешает содержимое папки / assets / и / Сеть / активы / папка. Вот почему это решение лучше подходит для расширенного шаблона приложения, если только вы не захотите переместить весь свой код вместе с папкой vendors в отдельную папку, как это сделал Yii 1.x.
Лучший способ решить эту проблему - добавить дополнительный файл .htaccess в корневой каталог вашего приложения.
Опции -Indexes RewriteEngine для RewriteRule ^ (. *) $ Web / $ 1 [L]Обратите внимание, что это будет работать только в том случае, если у вас есть вышеупомянутый файл .htaccess в веб-каталоге. В противном случае запрос попадет во внутренний цикл перенаправления.
Есть много сайтов, которые показывают аналогичные конфигурации, которые являются более сложными. Поскольку мы перенаправляем все запросы в веб-папку, нет необходимости запрещать доступ к файлам, начинающимся с точки, JSON-файлам и т. Д. Базовый шаблон не имеет ни одного из этих файлов в веб-папке. Для расширенного шаблона вы можете запретить доступ к точечным файлам, добавив эти строки.
<Files ~ "(^ \. | \ / \.)"> Порядок разрешить, запретить запрещать все </ Files>Теперь мы должны сообщить Yii, что наш базовый URL изменился. Мы делаем это, настраивая baseUrl для urlManager и компонент запроса в config / web.php.
$ config = [// ... 'components' => ['urlManager' => ['class' => 'yii \ web \ UrlManager', 'showScriptName' => false, 'enablePrettyUrl' => true, 'baseUrl '=>' / ',],' request '=> [' baseUrl '=>' ', // ...], // ...Если ваше приложение находится в подпапке, введите имя подпапки в параметр baseUrl 'baseUrl' => '/ app',.
Расширенный шаблон
Мы можем настроить расширенный шаблон аналогично базовому шаблону. Файлы .htaccess в веб-папках будут одинаковыми. Но файл .htaccess для корневой папки будет другим, чтобы разрешать запросы к бэкэнд-приложению.
Опции -Indexes RewriteEngine для #, если запрос не к бэкэнду, направьте его в / frontend / web RewriteCond% {REQUEST_URI}! ^ / Backend RewriteRule ^ (. *) $ / Frontend / web / $ 1 [L] # другой маршрут запрос к бэкэнду RewriteRule ^ backend /(.*)$ backend / web / $ 1 [L]Эти правила не вызывают цикл перенаправления, поскольку запрос в дальнейшем переписывается правилами в файле .htaccess веб- каталога.
Не забудьте настроить baseUrl для компонента запроса и urlManager.
Ссылки с бэкэнда на фронтэнд
Официальная документация предполагает, что для создания ссылок из внутреннего приложения на приложение внешнего интерфейса и приложение внешнего интерфейса на внутреннее приложение необходимо настроить дополнительный компонент kel urlManagerBac для приложения внешнего интерфейса.
'urlManager' => ['class' => 'yii \ web \ UrlManager', 'baseUrl' => '', 'enablePrettyUrl' => true, 'showScriptName' => false,], 'urlManagerBackend' => [' class '=>' yii \ web \ UrlManager ',' baseUrl '=>' / backend ',' enablePrettyUrl '=> true,' showScriptName '=> false,],И дополнение urlManagerFrontend для внутреннего приложения.
'urlManager' => ['class' => 'yii \ web \ UrlManager', 'baseUrl' => '/ backend', 'enablePrettyUrl' => true, 'showScriptName' => false,], 'urlManagerFrontend' => ['class' => 'yii \ web \ UrlManager', 'baseUrl' => '', 'enablePrettyUrl' => true, 'showScriptName' => false,],Затем вы можете использовать их следующим образом: $ frontendUrl = \ Yii :: $ app-> urlManagerFrontend-> createUrl (['site / index']);
Это замечательно, когда у вас нет каких-либо правил URL, в противном случае вам придется не только дублировать все правила, но и менять их в двух местах. Чтобы избежать этого, вы можете сохранить конфигурацию для urlManager в отдельных файлах и загрузить с функцией require.
'urlManager' => require ('urlmanager.php'), 'urlManagerBackend' => require ('../../ backend / config / url-manager.php'),Для бэкэнда:
'urlManager' => require ('urlmanager.php'), 'urlManagerFrontend' => require ('../../ frontend / config / url-manager.php'),И вот как вы можете сохранить конфигурацию в ваших файлах url-manager.php.
<? php return ['class' => 'yii \ web \ UrlManager', 'showScriptName' => false, 'enablePrettyUrl' => true,];Конечный слеш
Если вы когда-либо использовали Зубастик возможно, вы получили уведомление о проблеме с косой чертой.
Вы можете исправить это, добавив эти две строки в ваш файл /web/.htaccess сразу после RewriteEngine :
RewriteCond% {REQUEST_FILENAME}! -D RewriteRule ^ (. *) / $ / $ 1 [L, R = 301]Конфигурирование Apache напрямую
Файлы .htaccess удобны тем, что вы можете связать их вместе с вашим приложением, а также потому, что вам не нужно перезапускать Apache после изменения чего-либо внутри файла .htaccess, чтобы изменения вступили в силу. Но вы также должны платить производительностью, потому что Apache должен сканировать файлы .htaccess при каждом запросе. Чтобы избежать этого, вы можете настроить Apache из httpd.conf.
Вот пример конфигурации, которую я использовал для VirtualHost на компьютере с Windows.
<VirtualHost *: 80> ServerAdmin webmaster @ mytestapp DocumentRoot "C: \ wamp \ www \ mytestapp \ frontend \ web" ServerName mytestapp ErrorLog "logs / mytestapp-error.log" Журналы CustomLog "/ mytestapp-access.log" общие псевдонимы / admin "C: \ wamp \ www \ mytestapp \ backend \ web" <Каталог "C: \ wamp \ www \ mytestapp \ frontend \ web"> RewriteEngine на RewriteCond% {REQUEST_FILENAME}! -f RewriteCond% {REQUEST_FILENAME}! -d RewriteRule. index.php AllowOverride Нет Порядок allow, deny Allow from all </ Directory> <Directory "C: \ wamp \ www \ mytestapp \ backend \ web"> RewriteEngine на RewriteCond% {REQUEST_FILENAME}! -f RewriteCond% {REQUEST_FILENAME}! - d RewriteRule. index.php AllowOverride Нет Порядок allow, deny Allow from all </ Directory> </ VirtualHost>Обратите внимание, что в этой конфигурации бэкэнд-приложение доступно через маршрут / admin.
Правила
Теперь, когда у нас есть настройки, мы можем начать улучшать наши URL.
'urlManager' => ['class' => 'yii \ web \ UrlManager', 'baseUrl' => '/', 'enablePrettyUrl' => true, 'showScriptName' => false, 'enableStrictParsing' => true, ' rules '=> [' / '=>' site / index ',' about '=>' site / about ',' contact '=>' site / contact ',' login '=>' site / login ',' logout '=>' site / logout ',' captcha '=>' site / captcha ',' signup '=>' site / signup ',' request-password-reset '=>' site / request-password-reset ' , 'reset-password' => 'site / reset-password',],],'enableStrictParsing' => true указывает Yii2 разрешать только маршруты, перечисленные в правилах. Вам решать, хотите вы этого или нет.
Учебник по расширенной маршрутизации с помощью urlManager скоро появится.