yii2 实现默认路由与美化路都能访问

默认路由

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' => [],
],

此时,通过默认路由和美化路由都可以进行访问了。

发布了48 篇原创文章 · 获赞 13 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_37825371/article/details/103299063