Как переписать URL в yii2
Я установил yii2 в моей системе. URL по умолчанию localhost/projectname/backend/web/
,
Я хочу, чтобы мой URL был http://localhost/projectname
для внешнего интерфейса и http://localhost/projectname/admin
для бэкэнда. Я следую за 2-м ответом, т.е. заданным despotbg этой ссылки. Yii2 htaccess - Как скрыть интерфейс / веб и сервер / веб-ПОЛНОСТЬЮ, но я получаю следующую ошибку
Invalid Call - yii\base\InvalidCallException Установка свойства только для чтения: yii\web\Application::request
Пожалуйста, предложите мне, как я могу удалить эту ошибку, чтобы я мог переписать URL моего проекта. Я работаю на wamp сервере
2 ответа
Ответ был обновлен и теперь работает нормально...
Внешний интерфейс
Измените файл frontend / config / main.php:
....
'components' => [
....
'request'=>[
'baseUrl'=>'/projectname',
],
'urlManager'=>[
'scriptUrl'=>'/projectname/index.php',
],
// use the following, if you want to enable speaking URL for the frontend
// 'urlManager' => [
// 'enablePrettyUrl' => true,
// 'showScriptName' => false,
// ],
],
Backend
Изменить файл backend / config / main.php:
....
'components' => [
....
'request'=>[
'baseUrl'=>'/projectname/admin',
],
'urlManager'=>[
'scriptUrl'=>'/projectname/admin/index.php',
],
// use the following, if you want to enable speaking URL for the backend
// 'urlManager' => [
// 'enablePrettyUrl' => true,
// 'showScriptName' => false,
// ],
],
Apache (.htaccess с mod_rewrite)
Создайте файл.htaccess в корневом каталоге проекта (где находится composer.json):
RewriteEngine On
# End the processing, if a rewrite already occurred
RewriteRule ^(frontend|backend)/web/ - [L]
# Handle the case of backend, skip ([S=1]) the following rule, if current matched
RewriteRule ^admin(/(.*))?$ backend/web/$2 [S=1]
# handle the case of frontend
RewriteRule .* frontend/web/$0
# Uncomment the following, if you want speaking URL
#RewriteCond %{REQUEST_FILENAME} !-f
#RewriteCond %{REQUEST_FILENAME} !-d
#RewriteRule ^([^/]+/web)/.*$ $1/index.php
Бэкенд \ Config\main.php
// backend, under components array
'request'=>[
'class' => 'common\components\Request',
'web'=> '/backend/web',
'adminUrl' => '/admin'
],
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
],
создать файл request.php на общих \ компонентах
<?php
namespace common\components;
class Request extends \yii\web\Request {
public $web;
public $adminUrl;
public function getBaseUrl(){
return str_replace($this->web, "", parent::getBaseUrl()) . $this->adminUrl;
}
/*
If you don't have this function, the admin site will 404 if you leave off
the trailing slash.
E.g.:
Wouldn't work:
site.com/admin
Would work:
site.com/admin/
Using this function, both will work.
*/
public function resolvePathInfo(){
if($this->getUrl() === $this->adminUrl){
return "";
}else{
return parent::resolvePathInfo();
}
}
}
Попробуйте это, я надеюсь, это поможет вам..