Как включить чистые URL-адреса в Yii2. Я хочу удалить index.php и '?' от параметров URL. Какой раздел нужно отредактировать в Yii2 для этого?
Включить чистый URL-адрес в Yii2
Ответ 1
Я получил это работает в yii2. Включите mod_rewrite
для Apache
. Для basic template
сделайте следующее: создайте файл .htaccess в веб-папке и добавьте
RewriteEngine on
# If a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Otherwise forward it to index.php
RewriteRule . index.php
Затем в папке конфигурации, в web.php добавить в компоненты
'urlManager' => [
'class' => 'yii\web\UrlManager',
// Disable index.php
'showScriptName' => false,
// Disable r= routes
'enablePrettyUrl' => true,
'rules' => array(
'<controller:\w+>/<id:\d+>' => '<controller>/view',
'<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>',
'<controller:\w+>/<action:\w+>' => '<controller>/<action>',
),
],
В случае advanced template
создайте файлы .htaccess
внутри папок backend/web
и frontend/web
и добавьте компонент urlManager
common/config/main.php
Ответ 2
Первый важный момент заключается в том, что
Module_Rewrite включен на вашем сервере (LAMP, WAMP, XAMP..etc). Для переадресации URL в среде yii2. Создайте один файл .htaccess и поместите в папку /web.
RewriteEngine on
# If a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Otherwise forward it to index.php
RewriteRule . index.php
Второй шаг
Папка common/config/main-local.php
добавить в массив компонентов
'urlManager' => [
'class' => 'yii\web\UrlManager',
// Disable index.php
'showScriptName' => false,
// Disable r= routes
'enablePrettyUrl' => true,
'rules' => array(
'<controller:\w+>/<id:\d+>' => '<controller>/view',
'<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>',
'<controller:\w+>/<action:\w+>' => '<controller>/<action>',
),
],
Ответ 3
Для меня проблема заключалась в следующем:
- Отсутствует .htaccess в веб-папке, как указано выше.
- В директиве AllowOverride установлено значение None (Нет), в котором отключена переадресация URL. Я изменил его на All, и теперь красивые URL-адреса работают хорошо.
<Directory "/path/to/the/web/directory/">
Options Indexes
FollowSymLinks MultiViews
AllowOverride All
Require all granted
</Directory>
Ответ 4
Сначала создайте .htaccess
в корневой папке в своем проекте Yii2 со следующим содержимым:
Options +Indexes
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_URI} !^public
RewriteRule ^(.*)$ frontend/web/$1 [L]
</IfModule>
# Deny accessing below extensions
<Files ~ "(.json|.lock|.git)">
Order allow,deny
Deny from all
</Files>
# Deny accessing dot files
RewriteRule (^\.|/\.) - [F]
Создайте еще один файл .htaccess
в ваших веб-папках со следующим содержимым:
frontend/web/
add backend/web/
Не забудьте добавить файл .htaccess
в обе веб-папки:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php
Теперь это сделано. Измените конфигурацию вашего URL в Yii2:
<?php
use \yii\web\Request;
$baseUrl = str_replace('/frontend/web', '', (new Request)->getBaseUrl());
$config = [
'components' => [
'request' => [
// !!! insert a secret key in the following (if it is empty) - this is required by cookie validation
'cookieValidationKey' => 'aiJXeUjj8XjKYIG1gurMMnccRWHvURMq',
'baseUrl' => $baseUrl,
],
"urlManager" => [
'baseUrl' => $baseUrl,
'enablePrettyUrl' => true,
'showScriptName' => false,
"rules" => [
"home" => "site/index",
"about-us" => "site/about",
"contact-us" => "site/contact",
]
]
],
];
return $config;
Ваш URL изменится на:
localhost/yii2project/site/about
=> localhost/yii2project/about-us
localhost/yii2project/site/contact
=> localhost/yii2project/contact-us
localhost/yii2project/site/index
=> localhost/yii2project/home
Вы можете получить доступ к вашему администратору через
localhost/yii2project/backend/web
Ответ 5
на nginx настраивается таким образом
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
Ответ 6
Просто чтобы добавить к этому обсуждению - я только что установил Yii2, и он включает следующий закомментированный код в config/web.php:
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'rules' => [],
],
Если вы добавите файл .htaccess в принятый ответ, то просто раскомментируйте приведенные выше, красивые URL будут работать (я понятия не имею, для чего нужны "правила" в принятом ответе, но, похоже, все работает без них).
Ответ 7
Шаг 1: Поместите файл .htaccess
в корень.
Options –Indexes
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_URI} !^public
RewriteRule ^(.*)$ frontend/web/$1 [L]
</IfModule>
# Deny accessing below extensions
<Files ~ "(.json|.lock|.git)">
Order allow,deny
Deny from all
</Files>
# Deny accessing dot files
RewriteRule (^\.|/\.) - [F]
Шаг 2: Поместите файл .htaccess
в frontend/web
.
RewriteEngine on
# If a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Otherwise forward it to index.php
RewriteRule . index.php
Шаг 3: Затем изменения в frontend/config/main.php
. Следующий код должен быть добавлен внутри 'components' => []
.
'request' => [
'csrfParam' => '_csrf-frontend',
'baseUrl' => '/yii-advanced', //http://localhost/yii-advanced
],
'urlManager' => [
'class' => 'yii\web\UrlManager',
'showScriptName' => false, // Disable index.php
'enablePrettyUrl' => true, // Disable r= routes
'rules' => array(
'about' => 'site/about',
'service' => 'site/service',
'contact' => 'site/contact',
'signup' => 'site/signup',
'login' => 'site/login',
),
],
Вышеуказанные шаги работают для меня.
Ответ 8
Что сработало для me-
создайте .htaccess в корневой папке моего проекта Yii2 и добавьте following-
<IfModule mod_rewrite.c>
Options +FollowSymlinks
RewriteEngine On
</IfModule>
<IfModule mod_rewrite.c>
RewriteCond %{REQUEST_URI} ^/.*
RewriteRule ^(.*)$ web/$1 [L]
RewriteCond %{REQUEST_URI} !^/web/
RewriteCond %{REQUEST_FILENAME} !-f [OR]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ web/index.php
</IfModule>
Созданы новые веб-папки файла .htaccess со следующим содержимым:
frontend/web/
и добавил following-
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php
Затем добавил urlmanager here-
projectFolder/common/config/main.php
Для меня его там не было, поэтому добавил это as-
'urlManager' => [
'class' => 'yii\web\UrlManager',
'enablePrettyUrl' => true,
'showScriptName' => false,
/* 'rules' => [
'<controller:\w+>/<id:\d+>' => '<controller>/view',
'<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>',
'<controller:\w+>/<action:\w+>' => '<controller>/<action>',
],*/
],
Убедитесь, что этот код должен быть в 'components' => []
.
Перезагрузите мой сервер, и все работает нормально.
Ответ 9
Пошаговая инструкция
Шаг 1
В корне проекта добавьте .htaccess со следующим содержимым:
Options +FollowSymLinks
IndexIgnore */*
RewriteEngine On
RewriteCond %{REQUEST_URI} !^/(web)
RewriteRule ^assets/(.*)$ /web/assets/$1 [L]
RewriteRule ^css/(.*)$ web/css/$1 [L]
RewriteRule ^js/(.*)$ web/js/$1 [L]
RewriteRule ^images/(.*)$ web/images/$1 [L]
RewriteRule (.*) /web/$1
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /web/index.php
Шаг 2
В папке/веб файле добавьте файл .htaccess со следующим содержимым:
RewriteEngine On RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php
Шаг 3
В файле /config/web.php в элементах элементов массива добавьте следующий код:
'request' => [
// !!! insert a secret key in the following (if it is empty) - this is required by cookie validation
'cookieValidationKey' => 'yYy4YYYX8lYyYyQOl8vOcO6ROo7i8twO',
'baseUrl' => ''
],
//...
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'rules' => [
'' => 'site/index',
'<controller:\w+>/<action:\w+>/' => '<controller>/<action>',
],
],
Готово..
Ответ 10
Шаг 1: в проекте config/main.php, например: frontend/config/main.php
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'rules' => [],
]
Шаг 2: создайте веб-папку с вложенными файлами .htaccess, например: frontend/web
RewriteEngine on
# if a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# otherwise forward it to index.php
RewriteRule . index.php
#php_flag display_errors on
#php_value error_reporting 2039
Ответ 11
Вам нужно всего лишь изменить два файла: ваш .htaccess в backend/web и общий основной файл.
файл .htaccess
RewriteEngine on
# If a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Otherwise forward it to index.php
RewriteRule . index.php
main.php
'components' => [
'cache' => [
'class' => 'yii\caching\FileCache',
],
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'rules' => [
'<controller:\w+>/<action:\w+>' => '<controller>/<action>',
'<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>',
'<controller:\w+>/<id:\d+>' => '<controller>/view',
],
],
],
Ответ 12
конфиг /web.php
$params = require __DIR__ . '/params.php';
$db = require __DIR__ . '/db.php';
$config = [
'id' => 'basic',
'basePath' => dirname(__DIR__),
'bootstrap' => ['log'],
'aliases' => [
'@bower' => '@vendor/bower-asset',
'@npm' => '@vendor/npm-asset',
],
'components' => [
'assetManager' => [
// override bundles to use local project files :
'bundles' => [
'yii\bootstrap4\BootstrapAsset' => [
'sourcePath' => '@app/assets/source/bootstrap/dist',
'css' => [
YII_ENV_DEV ? 'css/bootstrap.css' : 'css/bootstrap.min.css',
],
],
'yii\bootstrap4\BootstrapPluginAsset' => [
'sourcePath' => '@app/assets/source/bootstrap/dist',
'js' => [
YII_ENV_DEV ? 'js/bootstrap.js' : 'js/bootstrap.min.js',
]
],
],
],
'request' => [
// !!! insert a secret key in the following (if it is empty) - this is required by cookie validation
'cookieValidationKey' => 'V_Pj-uMLTPPxv0Be5Bwe3-UCC6EjGRuH',
'baseUrl' => '',
],
'formatter' => [
'dateFormat' => 'dd/MM/yyyy',
'decimalSeparator' => ',',
'thousandSeparator' => '.',
'currencyCode' => 'BRL',
'locale' => 'pt-BR',
'defaultTimeZone' => 'America/Sao_Paulo',
'class' => 'yii\i18n\Formatter',
],
'datehelper' => [
'class' => 'app\components\DateBRHelper',
],
'formatcurrency' => [
'class' => 'app\components\FormatCurrency',
],
'request' => [
// !!! insert a secret key in the following (if it is empty) - this is required by cookie validation
'cookieValidationKey' => '123456',
],
'cache' => [
'class' => 'yii\caching\FileCache',
],
'user' => [
'identityClass' => 'app\models\User',
'enableAutoLogin' => true,
],
'errorHandler' => [
'errorAction' => 'site/error',
],
'mailer' => [
'class' => 'yii\swiftmailer\Mailer',
// send all mails to a file by default. You have to set
// 'useFileTransport' to false and configure a transport
// for the mailer to send real emails.
'useFileTransport' => true,
],
'log' => [
'traceLevel' => YII_DEBUG ? 3 : 0,
'targets' => [
[
'class' => 'yii\log\FileTarget',
'levels' => ['error', 'warning'],
],
],
],
'db' => $db,
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'enableStrictParsing' => true,
'rules' => [
'' => 'site/index',
'<controller:\w+>/<action:\w+>/' => '<controller>/<action>',
],
],
],
'params' => $params,
];
if (YII_ENV_DEV) {
// configuration adjustments for 'dev' environment
$config['bootstrap'][] = 'debug';
$config['modules']['debug'] = [
'class' => 'yii\debug\Module',
// uncomment the following to add your IP if you are not connecting from localhost.
//'allowedIPs' => ['127.0.0.1', '::1'],
];
$config['bootstrap'][] = 'gii';
$config['modules']['gii'] = [
'class' => 'yii\gii\Module',
// uncomment the following to add your IP if you are not connecting from localhost.
//'allowedIPs' => ['127.0.0.1', '::1'],
];
}
return $config;
arquivo.htaccess na pasta raiz
<IfModule mod_rewrite.c>
Options +FollowSymlinks
RewriteEngine On
</IfModule>
<IfModule mod_rewrite.c>
RewriteCond %{REQUEST_URI} ^/.*
RewriteRule ^(.*)$ web/$1 [L]
RewriteCond %{REQUEST_URI} !^/web/
RewriteCond %{REQUEST_FILENAME} !-f [OR]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ web/index.php
</IfModule>
.htaccess dentro da pasta web/
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php
Ответ 13
Я не знаю, почему вы, ребята, просто не заходите в папку поставщика yii2 и не устанавливаете общедоступный $enablePrettyUrl = true; "(вместе с изменением htaccess, конечно). Это работало отлично для меня, и это намного проще И у меня есть один файл htaccess - в корне проекта, а не в трех разных местах. Кроме того, когда я сделал то, что вы, ребята, предложили для программ config/main.php в Advanced Yii2, это не сработало Я получил 404s из ying-yang. Я взял его, и prettyUrls снова отлично справились. Возможно, мне не следует делать это из-за обновления Composer, но есть так много "фиктивных" решений, что я устал от этого.