.htaccess — как удалить URL (/web/index.php) yii 2 и установить маршрут с параметром с чистым URL?

Первый вопрос:
я уже удаляю index.php, но я хочу удалить /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

а это config/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>',
),
],

работает нормально, но все еще использует /web ,
возможно ли удалить /web ?

Второй вопрос:

я не могу установить маршрут с параметром с этим чистым URL, мой маршрут Url::toRoute(['transaction/getrequestdetail/', 'id' => 1 ]);

каким должен быть маршрут? а как с 2-мя параметрами route?

4

Решение

Для расширенного применения выполните следующие действия:

1) Добавить следующее htaccess в frontend/web

RewriteEngine on

# If a directory or a file exists, use the request directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Otherwise forward the request to index.php
RewriteRule . index.php

2) Добавить следующее htaccess в root folder где установлено приложение

# prevent directory listings
Options -Indexes
IndexIgnore */*

# follow symbolic links
Options FollowSymlinks
RewriteEngine on
RewriteRule ^admin(/.+)?$ backend/web/$1 [L,PT]
RewriteRule ^(.+)?$ frontend/web/$1

3) Редактировать свой frontend/config/main.php файл со следующим в верхней

use \yii\web\Request;
$baseUrl = str_replace('/frontend/web', '', (new Request)->getBaseUrl());

4) Добавить request component к массиву компонентов в том же файле, т.е. frontend/config/main.php

'components' => [
'request' => [
'baseUrl' => $baseUrl,
],
],

Вот и все. Теперь вы можете получить доступ к веб-интерфейсу без web / index.php

Для второго вопроса вам нужно написать правило для него в вашем компоненте менеджера URL.

Что-то вроде этого:

'urlManager' => [
'baseUrl' => $baseUrl,
'class' => 'yii\web\UrlManager',
// Disable index.php
'showScriptName' => false,
// Disable r= routes
'enablePrettyUrl' => true,
'rules' => array(
'transaction/getrequestdetail/<id>' => 'transaction/getrequestdetail',
),
],
16

Другие решения

Если после ответов на вопросы он все еще не работает, вы можете отредактировать файл apache2.conf в своем любимом редакторе, чтобы изменить

AllowOveride Нет в AllowOveride All

В Ubuntu файл находится по адресу файл /etc/apache2/apache2.conf

Окончательное редактирование должно выглядеть

<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>

Наконец, перезапустите сервер Apache

2

Вы можете добавить информацию в конфигурацию файла для удаления / web:

$baseUrl = str_replace('/web', '', (new Request)->getBaseUrl());

return [
...
'components' => [
'request' => [
'baseUrl' => $baseUrl,
],
...
]
]
1

С помощью str_replace('/frontend/web', '', (new Request)->getBaseUrl()) для определения базового URL это плохая идея и использование str_replace('/web', '', (new Request)->getBaseUrl()) это ужасная идея str_replace() удаляет все вхождения запрошенной строки, поэтому str_replace('/frontend/web', '', (new Request)->getBaseUrl()) для URL /frontend/web/tools/frontend/webalizer дам тебе /toolsalizer, Определенно не то, что вы хотите.

Если вы хотите удалить эту строку только с начала URL:

$baseUrl = (new Request())->getBaseUrl();
if ($baseUrl === '/frontend/web') {
$baseUrl = '';
} elseif (strncmp($baseUrl, '/frontend/web/', 14) === 0) {
$baseUrl = substr($baseUrl, 13);
}

Но лучшим решением было бы в первую очередь избежать всей проблемы, например, путем использование символических ссылок для имитации необходимой структуры каталогов для одного webroot.

0