如何删除 url (/web/index.php) yii 2 并使用 clean url 参数设置路由?
how to remove url (/web/index.php) yii 2 and set route with parameter with clean 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 个参数路由?
您可以在文件配置中添加信息删除/web:
$baseUrl = str_replace('/web', '', (new Request)->getBaseUrl());
return [
...
'components' => [
'request' => [
'baseUrl' => $baseUrl,
],
...
]
]
对于高级应用程序,请按照以下步骤操作:
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/ [L,PT]
RewriteRule ^(.+)?$ frontend/web/
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,
],
],
那就是 it.Now 你可以在没有 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',
),
],
如果在完成上述答案后仍然无法正常工作,那么您可以在您喜欢的编辑器中编辑 'apache2.conf' 文件以更改
AllowOveride None 到 AllowOveride All
在 Ubuntu,文件位于 /etc/apache2/apache2.conf
最终编辑应该看起来像
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
最后,重启Apache服务器
使用 str_replace('/frontend/web', '', (new Request)->getBaseUrl())
检测碱基 URL 是个坏主意,使用 str_replace('/web', '', (new Request)->getBaseUrl())
是个糟糕的主意。 str_replace()
删除所有出现的请求字符串,因此 str_replace('/frontend/web', '', (new Request)->getBaseUrl())
for 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);
}
但最好的解决办法是首先避免整个问题,例如 。
第一个问题:
我已经删除了 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 个参数路由?
您可以在文件配置中添加信息删除/web:
$baseUrl = str_replace('/web', '', (new Request)->getBaseUrl());
return [
...
'components' => [
'request' => [
'baseUrl' => $baseUrl,
],
...
]
]
对于高级应用程序,请按照以下步骤操作:
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/ [L,PT]
RewriteRule ^(.+)?$ frontend/web/
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,
],
],
那就是 it.Now 你可以在没有 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',
),
],
如果在完成上述答案后仍然无法正常工作,那么您可以在您喜欢的编辑器中编辑 'apache2.conf' 文件以更改
AllowOveride None 到 AllowOveride All
在 Ubuntu,文件位于 /etc/apache2/apache2.conf
最终编辑应该看起来像
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
最后,重启Apache服务器
使用 str_replace('/frontend/web', '', (new Request)->getBaseUrl())
检测碱基 URL 是个坏主意,使用 str_replace('/web', '', (new Request)->getBaseUrl())
是个糟糕的主意。 str_replace()
删除所有出现的请求字符串,因此 str_replace('/frontend/web', '', (new Request)->getBaseUrl())
for 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);
}
但最好的解决办法是首先避免整个问题,例如