Как в Yii2 basic убрать web/ из url при помощи .htaccess и правил urlManager'а?

Всем привет!
Сразу скажу, что я искал решение проблемы в гугле, решений много, но ни одно из них не подошло почему-то.
При изучении Yii2 столкнулся с такой проблемой:

нужно получить url domen/controller/action

но любой запрос вида domen/anything перенаправляет на defaultRoute
запросы типа domen/web/controller/action работают нормально

в конфиге web.php сейчас:
'urlManager' => [
			'showScriptName' => false,
			'enablePrettyUrl' => true,
			'rules' => [
				'<controller>/<action>' => '<controller>/<action>'
			]
		],

в корне сайта в .htaccess:
Options +FollowSymLinks
IndexIgnore */*
RewriteEngine on

RewriteCond %{REQUEST_URI} !^/(web)
RewriteRule (.*) /web/$1

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /web/index.php

в папке web в .htaccess:
RewriteEngine On RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule . index.php

Буду очень признателен в помощи решения проблемы!
  • Вопрос задан
  • 48129 просмотров
Решения вопроса 1
@urfinjazz Автор вопроса
Отвечу на свой вопрос :)
спасибо, Иван, за наводку

.htaccess в web оставляем такой же
.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

в конфиге web.php в 'request' добавляем строчку:
'baseUrl'=> '',

Всем спасибо за внимание!
Ответ написан
Пригласить эксперта
Ответы на вопрос 6
IvanCher
@IvanCher
Мысли шире
Если коротко, то вам нужно WebRoot указать не корневую папку с проектом (***/project), а папку web(***/project/web).
Ответ написан
Комментировать
phpnt
@phpnt
Как убрать web в этом видео, как использовать UrlManager в этом
Ответ написан
@Rusov
Если используете openserver и не подружаются только css, js скрипты, то в настройках openserver выберите только apache, без nginx
Ответ написан
Комментировать
Yan_Alex
@Yan_Alex
У меня заработало после добавления 'baseUrl'=> '', htaccess остался оригинальным, такой же как у автора в первом посте
Ответ написан
Комментировать
grachyoff
@grachyoff
Junior web-developer
Решение проблемы для Openserver. В корень сайта рядом с папкой basic создаем htaccess:
Options +FollowSymLinks
IndexIgnore */*
RewriteEngine on

RewriteCond %{REQUEST_URI} !^/(web)
RewriteRule ^assets/(.*)$ basic/web/assets/$1 [L]
RewriteRule ^css/(.*)$ basic/web/css/$1 [L]
RewriteRule ^js/(.*)$ basic/web/js/$1 [L]
RewriteRule ^images/(.*)$ basic/web/images/$1 [L]
RewriteRule (.*) basic/web/$1

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . basic/web/index.php


В папке web:
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule . index.php

Также в конфиг в request добавляем строку baseUrl =>'' и раскомментируем блок:
'urlManager' => [
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'rules' => [
            ],
        ],
Ответ написан
Комментировать
Прилетела ошибка связана с кеше на open server php7/ может кто знает как победить?
PHP Warning – yii\base\ErrorException
filemtime(): stat failed for D:\OpenServer\domains\yii2basic.ru\runtime/cache\60\60c69796c9cdfd66af3195782c1d16d7.bin
1. in D:\OpenServer\domains\yii2basic.ru\vendor\yiisoft\yii2\caching\FileCache.php at line 113
104105106107108109110111112113114115116117118119120121122                         * Retrieves a value from cache with a specified key.
     * This is the implementation of the method declared in the parent class.
     * @param string $key a unique key identifying the cached value
     * @return string|false the value stored in cache, false if the value is not in the cache or expired.
     */
    protected function getValue($key)
    {
        $cacheFile = $this->getCacheFile($key);
 
        if (@filemtime($cacheFile) > time()) {
            $fp = @fopen($cacheFile, 'r');
            if ($fp !== false) {
                @flock($fp, LOCK_SH);
                $cacheValue = @stream_get_contents($fp);
                @flock($fp, LOCK_UN);
                @fclose($fp);
                return $cacheValue;
            }
        }
                
2. in D:\OpenServer\domains\yii2basic.ru\vendor\yiisoft\yii2\caching\Cache.php at line 134 – yii\caching\FileCache::getValue('key' => ''60c69796c9cdfd66af3195782c1d16d...')
3. in D:\OpenServer\domains\yii2basic.ru\vendor\yiisoft\yii2\web\UrlManager.php at line 296 – yii\caching\Cache::get('key' => ''60c69796c9cdfd66af3195782c1d16d...')
4. in D:\OpenServer\domains\yii2basic.ru\vendor\yiisoft\yii2\web\UrlManager.php at line 229 – yii\web\UrlManager::getBuiltRulesFromCache('ruleDeclarations' => 'array (0 => array ('class' => 'y...')
5. in D:\OpenServer\domains\yii2basic.ru\vendor\yiisoft\yii2\web\UrlManager.php at line 211 – yii\web\UrlManager::buildRules('ruleDeclarations' => 'array (0 => array ('class' => 'y...')
6. in D:\OpenServer\domains\yii2basic.ru\vendor\yiisoft\yii2-debug\src\Module.php at line 215 – yii\web\UrlManager::addRules('rules' => 'array (0 => array ('class' => 'y...', 'append' => 'FALSE')
209210211212213214215216217218219220221                                [
                'class' => 'yii\web\UrlRule',
                'route' => $this->id . '/<controller>/<action>',
                'pattern' => $this->id . '/<controller:[\w\-]+>/<action:[\w\-]+>',
                'suffix' => false
            ]
        ], false);
    }
 
    /**
     * {@inheritdoc}
     */
    public function beforeAction($action)
                
7. in D:\OpenServer\domains\yii2basic.ru\vendor\yiisoft\yii2\base\Application.php at line 327 – yii\debug\Module::bootstrap('app' => 'class yii\web\Application { publ...')
8. in D:\OpenServer\domains\yii2basic.ru\vendor\yiisoft\yii2\web\Application.php at line 69 – yii\base\Application::bootstrap()
9. in D:\OpenServer\domains\yii2basic.ru\vendor\yiisoft\yii2\base\Application.php at line 273 – yii\web\Application::bootstrap()
10. in D:\OpenServer\domains\yii2basic.ru\vendor\yiisoft\yii2\base\BaseObject.php at line 109 – yii\base\Application::init()
11. in D:\OpenServer\domains\yii2basic.ru\vendor\yiisoft\yii2\base\Application.php at line 206 – yii\base\BaseObject::__construct('config' => 'array ('id' => 'basic', 'bootstr...')
12. in D:\OpenServer\domains\yii2basic.ru\web\index.php at line 12 – yii\base\Application::__construct('config' => 'array ('id' => 'basic', 'bootstr...')
6789101112                     
require __DIR__ . '/../vendor/autoload.php';
require __DIR__ . '/../vendor/yiisoft/yii2/Yii.php';
 
$config = require __DIR__ . '/../config/web.php';
 
(new yii\web\Application($config))->run();
                
$_COOKIE = [
    'PHPSESSID' => 'fvv6fua8cv84cvtbbddoab66h6',
    '_csrf' => '555228cc1e7ab80e85e0f45275012b60422d60f12addf3c56f67d1c97045e563a:2:{i:0;s:5:"_csrf";i:1;s:32:"pArGk2cTLQqNChEzFPQojeJtOtGjH1TH";}',
];

$_SESSION = [
    '__flash' => [],
];
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы