默认路由
yii2
框架默认路由形式如下:index.php?r=site/index
,这样的路由形式不太美观,因此我们通常使用美化路由,很方便的是,yii2
也很提供路由美化功能。
路由美化
在 yii2
中,关于路由美化的配置项默认是注释掉的,如果我们想启动路由美化,只需要打开注释即可。
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'rules' => [
],
],
此时,我们便可以通过美化后的路由进行访问了,如:index.php/site/index
。
这样比默认路由好多了,但是如果能把 index.php
入口脚本更好呢?
在 index.php
同级目录中,新建 .htaccess
文件,并添加如下代码:
RewriteEngine on
# 如果是一个目录或者文件,就访问目录或文件
RewriteCond %{REQUEST_FILENAME} !-d
# 如果文件存在,就直接访问文件,不进行下面的RewriteRule
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . index.php
此时直接访问,当然还是无法省略 index.php
访问的,还需要 web
服务器开启路由重写功能才行。
apache
直接开启路由重写模块即可。nginx
则需要在配置域名时添加如下代码才行:
location / {
# Redirect everything that isn't a real file to index.php
try_files $uri $uri/ /index.php$is_args$args;
}
此时,我们便可以通过 域名/site/index
访问了。
同时访问
以上两种路由访问方式,无论配置与不配置,都只能实现一种方式,那么,如果实现两种路由都能访问呢,这就需要我们对框架中的路由分发功能进行重写。
在 common/components
文件夹下新建 urlManager
继承自带的路由处理类,并重写路由分发的功能,具体代码如下:
<?php
namespace common\components;
class urlManager extends \yii\web\UrlManager
{
/**
* 解析路由请求,兼容美化与非美化路由
* @param \yii\web\Request $request
* @return array|bool
*/
public function parseRequest($request)
{
// 这里实际上就是通过判断 get 参数中 r 的值是否为空,如果为空则是美化路由,否则即为默认的路由方式,?r=site/index,如果 r 参数不为空,则仍然通过默认路由方式访问,否则以美化路由形式访问
$route = $request->getQueryParam($this->routeParam, '');
if ($route != '') {
$this->enablePrettyUrl = false;
}
return parent::parseRequest($request);
}
}
只是重写方法,不使用也不会发生作用,因此我们需要在配置文件中,使用路由美化使用自定义的路由处理类,代码如下:
'urlManager' => [
'class' => 'common\components\urlManager',
'enablePrettyUrl' => true,
'showScriptName' => false,
'rules' => [],
],
此时,通过默认路由和美化路由都可以进行访问了。