YII2设置路由美化访问,美化url

YII2设置rewrite伪静态 以及 YII2路由美化访问,美化url

注意:直接参考这篇官网教程即可:http://j.icoyun.com/archives/1191.html

 

 

Yii2 Apache + Nginx 路由重写

参考:https://www.cnblogs.com/bluebirds/p/7257522.html

一、什么是路由重写

原本的HTTP访问地址: www.test.com/index.php?r=post/view&id=100  表示这个请求将由PostController 的 actionView来处理。

重写后的HTTP访问地址 www.test.com/post/view/id/100  这样的链接看起来简洁美观,对于用户比较友好。同时,也比较适合搜索引擎的胃口, 据说是SEO的手段之一。

二、Apache 路由重写

(一)开启Apache的重写模块

1. 打开apache的config的 hhttpd.conf 将 #LoadModule rewrite_module modules/mod_rewrite.so  的#号去掉

2. 重启Apache服务器即可

(二)虚拟主机配置

1. 打开 Apache\conf\vhosts.conf配置路径

2. 将配置修改为如下:

YII2设置路由美化访问,美化url
<VirtualHost 127.0.0.1:80>
    ServerName test-yii2.com
    DocumentRoot F:/wamp64/www/yii2/frontend/web
    <Directory  "F:/wamp64/www/yii2/frontend/web">
        Options +Indexes +Includes +FollowSymLinks +MultiViews
        AllowOverride All
        Require all granted
        RewriteEngine on
        # 如果请求的是真实存在的文件或目录,直接访问
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        # 如果请求的不是真实文件或目录,分发请求至 index.php
        RewriteRule . index.php
    </Directory>
</VirtualHost>
YII2设置路由美化访问,美化url

3. 重启Apache

(三)还有另外一种配置方式,无需重启Apache服务器,当时改当时生效。

1. 在 “F:/wamp64/www/yii2/frontend/web”  目录下增加 .htaccess 代码如下:

    RewriteEngine on
    # 如果请求的是真实存在的文件或目录,直接访问
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    # 如果请求的不是真实文件或目录,分发请求至 index.php
    RewriteRule . index.php

(四) YII配置

1. 在main.php下 components这个数组中增加如下如下配置:

YII2设置路由美化访问,美化url
        'urlManager' => [
            'enablePrettyUrl' => true,  //开启美化url配置,默认关闭
            'enableStrictParsing' => false, //不启用严格解析,默认不启用.如果设置为true,则必须建立rules规则,且路径必须符合一条以上规则才允许访问
            'showScriptName' => false, //隐藏index.php
            'rules' => [
               // http://frontend.com/site/index 重写为  http://frontend.com/site
                '<controller:\w+>/'=>'<controller>/index',
            // http://frontend.com/site/view?id=1 重写为 http://frontend.com/site/1
                '<controller:\w+>/<id:\d+>' => '<controller>/view',
            // http://frontend.com/site/ceshi?id=123 重写为  http://frontend.com/site/ceshi/123
                '<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>',
            ]
        ],
YII2设置路由美化访问,美化url

=========================================================================================================

 

经常访问一些博客网站,点击文章之后的url地址总是http://…….10.html等,这样的形式就是利用了框架的路由进行了控制,yii2里面也提供了我们修改路由规则的方法,首先我们找到所要设置的路由规则的配置文件,yii2经过优化之后分了2个操作应用,一个是frontend和backend我目前在backend里面的config进行了配置,找到main.php文件

找到 components配置我们加入代码:

[php] view plain copy

  1. ‘components’ => [
  2.         ‘assetManager’ => [
  3.             ‘basePath’ => ‘@webroot/backend/web/assets’,
  4.             ‘baseUrl’ => ‘@web/backend/web/assets’
  5.         ],
  6.         ‘user’ => [
  7.             ‘identityClass’ => ‘common\models\User’,
  8.             ‘enableAutoLogin’ => true,
  9.         ],
  10.         ‘log’ => [
  11.             ‘traceLevel’ => YII_DEBUG ? 3 : 0,
  12.             ‘targets’ => [
  13.                 [
  14.                     ‘class’ => ‘yii\log\FileTarget’,
  15.                     ‘levels’ => [‘error’‘warning’],
  16.                 ],
  17.             ],
  18.         ],
  19.         ‘errorHandler’ => [
  20.             ‘errorAction’ => ‘site/error’,
  21.         ],//加入的url配置
  22.         ‘urlManager’ => [
  23.                 ‘enablePrettyUrl’ => true,//开启URL美化
  24.                 ‘showScriptName’ => false,//禁用index.php文件
  25.                 ‘rules’ => [
  26.                              ‘test/<id:\d+>.html’ => ‘test/articlelist’,//设置自己的路由规则,这里我设置了一个控制器里面的一个方法的规则,只要满足了这个规则就会跳转到相应的方法去处理
  27.                            ]
  28.         ],
  29.     ],

写一个测试控制器:

[php] view plain copy

  1. <?php
  2. namespace backend\controllers;
  3. use Yii;
  4. use yii\filters\AccessControl;
  5. use yii\web\Controller;
  6. use common\helpers\Helper;
  7.  class TestController extends Controller
  8.  {
  9.         public $layout = false; //不使用布局
  10.         public  $enableCsrfValidation=false;
  11.         public function actionArticlelist(){
  12.                 print_r($_GET);
  13.         }
  14.         public function actionMymethod(){
  15.                 echo “Hello”;
  16.         }
  17.  }

 

我们试着访问看是否成功:

YII2设置路由美化访问,美化url

看来是跳转了,是否影响了其他方法呢?

YII2设置路由美化访问,美化url

看来 只有符合路由规则的才会进行相应的跳转,好了,yii2的路由设置就是这样,希望可以帮助到大家。

 

==========================================================

第一个教程

原文地址:http://www.cnblogs.com/magy/p/4314687.html

目的:我只想去掉浏览器地址栏中的index.php?r=这一块。

在/config/web.php中 ’components’=>[] 中添加如下代码:

YII2设置路由美化访问,美化url
1 'urlManager' => [
2             'enablePrettyUrl' => true,
3             'showScriptName' => false,//隐藏index.php 
4             //'enableStrictParsing' => false,
5             'suffix' => '.html',//后缀,如果设置了此项,那么浏览器地址栏就必须带上.html后缀,否则会报404错误
6             'rules' => [
7                 //'<controller:\w+>/<action:\w+>'=>'<controller>/<action>',
8             ],
9         ],
YII2设置路由美化访问,美化url

如果带了改了后缀这一下,请记得一定要给浏览器地址栏的路径最后面加上.html。

改了以上这些,我发现?r=这块可以用/代替访问了,但是想隐藏掉index.php还是不行。

我们还需在index.php同级的目录下添加.htaccess文件:

打开记事本,输入以下代码:

1
2
3
4
5
6
7
8
9
10
Options +FollowSymLinks
    IndexIgnore */*
    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

然后保存在与入口文件index.php同级的目录下,也就是/web目录下,文件名自己填.htaccess,文件类型选择 所有文件 (*.*) ,然后保存即可。

最后测试OK了!

第二个教程

原文链接:http://www.manks.top/document/yii2-urlManager-prettyUrl.html

何为美化路由呢?美化嘛,无外乎就是给路由化化妆,让她好看点。我虽没化过妆,那好歹也是见过描描眉的。下面我们就来看看如何给你的路由添加添加点“颜色”的。

yii的路由美化工作,全权由urlManager组件负责。默认情况下,该组件并没有开启。

我们在配置文件backend\config\main.php中简单配置下该组件

'urlManager' => [
    'enablePrettyUrl' => false,
    'showScriptName' => true,
    'enableStrictParsing' => false,
    'suffix' => '',
    'rules' => [
    ],
],

按照我们上文的配置,你可能看不到当前路由有什么变化,我们来做几个小例子分别讲述下要介绍的这几个参数

enablePrettyUrl:是否开启美化效果

我们把false改为true前后,分别访问下左侧的“博客”菜单项,前后对比如下:

false:/index.php?r=blog%2Findex
true:/index.php/blog/index

这效果感觉跟开了美颜相机似的。

showScriptName:是否或略脚本名index.php

就上面的链接而言,大多数情况下我们并不想展示index.php,我们更想要的是/blog/index效果,这个时候showScriptName的作用就显现出来了

不过该参数还需要我们配置web服务器如apache和nginx,为了更详细的说明,我们准备单独写篇文章说说。

enableStrictParsing:是否开启严格解析路由

什么意思呢?假设我们在开启了路由美化的功能(enablePrettyUrl设置为true),enableStrictParsing设置为false的情况下,我们直接访问/index.php/blog/index肯定是没有问题的。但是如果我们直接访问/index.php?r=blog%2Findex呢?发现页面展示的效果是/site/index(实际上这里展示的默认的路由页面),并非是博客列表页面。如果我们把enableStrictParsing参数设置为true你会发现页面直接抛出404。因为这货设置为true之后,会匹配rules选项中设定的至少一个规则,那我们这里先设置一个路由,不然没法继续了。

'rules' => [
    "<controller:\w+>/<action:\w+>"=>"<controller>/<action>",
],

此时刷新下/index.php/blog/index就正常了。

rules:包含了路由的匹配规则列表

也就是说,如果我们要定制特殊的路由,就需要通过这个属性进行配置。

rules包含着我们配置的路由规则列表,当解析一个路由或者生成一个路由的时候,匹配规则的顺序是从第一条规则开始,知道匹配到第一个满足的为止。

我们来说一下rules的每一项的规则,以/blogs为例,当然这是一个不存在的路由,你可以访问下试试会不会抛出404异常。

我们在rules的第一项添加,现在我们的rules是下面这样的

'rules' => [
    '/blogs' => '/blog/index',
    "<controller:\w+>/<action:\w+>"=>"<controller>/<action>",
],

这其实就是把我们访问的/blogs路由映射到/blog/index路由上面了,所以我们访问/blogs才得以被解析并能正常访问/blog/index页面。

我们再举一个例子,如果我们要求访问/blogs/1可以展示/blog/view?id=1这个界面呢?

实际上/blog/view?id=1需要一个参数是id,我们可以这样做一个映射

'/blogs/<id:\d+>' => '/blog/view',

可以自行体会一下。

但是,如果我们的项目要求所有的路由都这样被解析,每一个都这样写rules岂不是很庞大很复杂?

rules不只支持正则匹配,我们还可以配置controller和action匹配所有满足的路由。比如我们在开启enableStrictParsing为true后,设置的

"<controller:\w+>/<action:\w+>"=>"<controller>/<action>",

再比如如果我们想要所有的controller/id映射到controller/view界面,我们可以这样配置

'rules' => [
    '/blogs' => '/blog/index',
    // '/blogs/<id:\d+>' => '/blog/view',
    '<controller:\w+>/<id:\d+>' => '<controller>/view',
    "<controller:\w+>/<action:\w+>"=>"<controller>/<action>",
],

此时我们访问 /index.php/blog/1 会正常显示/blog/view?id=1这个界面。

suffix:url后缀

有时候我们想要访问的页面都带上.html后缀,这个时候只需要简单的配置suffix参数即可

'suffix' => '.html',

如果我们此时在访问/index.php/blog/index恐怕是不可以的,因为我们已经要求所有的url后缀都要带上.html才可以被正常解析!即只有访问 /index.php/blog/index.html 才是可以的。

urlManager的匹配规则我们掌握了,但是!整个网站的链接是要我们手动写的,难不成你天天修改规则,我还要天天修改链接的写法吗?这简直就是一场“灾难”!

举一个例子,由于网站前期并没有考虑页面路由添加.html后缀利于seo搜索的问题,小张三,哦不小张,名字有点lower,小三吧,哦不还是小张吧。小张整站的链接的写法都是这样的

<a href="/site/index">Yii Forum &raquo;</a>
<a href="/site/index2">Yii Forum2 &raquo;</a>
<a href="/site/index3">Yii Forum3 &raquo;</a>

固定死的写法,这无异于给自己埋了一颗定时炸弹!

有一天老大说了,要求我们网站所有的链接都加后缀.html。no zuo no die!

再来一个小练习考考各位:

一般情况下,我们的后台列表的数据分页是借助yii\data\Pagination生成的,正常情况下其链接是这样的

/blog/index?page=2

如果我们想要的链接是下面这种形式的,请问如何设计?

// 其中 2是具体分页的页面
/blog/index/2.html

这个例子具体典型性,请一定要先思考再继续看下面答案!

你是不是没思考,请先思考后动手尝试几种方案后再继续往下阅读!

来,我们公布看看这个案例如何解决

列表页的数据我们是通过gridview进行展示的,但数据的来源,是通过BlogSearch的search方法提供的,我们看下这个search方法,发现最终提供数据的是ActiveDataProvider实例,这个ActiveDataProvider厉害了,它还集成了分页类yii\data\Pagination。只需要通过ActiveDataProvider的pagination属性便可以配置分页类。具体的分页基础可以参考这篇文章

我们的blog表暂时没那么多数据,为了分页效果我们暂时设置pageSize为2,这里并设置每页数量的参数为false

$dataProvider = new ActiveDataProvider([
    'query' => $query,
    'pagination' => [
        'pageSize' => 2,
        'pageSizeParam' => false,
    ],
]);

接下来我们要做的,便是配置urlManager的路由规则,以便生成的链接满足我们的需求。

在rules中添加一条如下的规则即可

'<controller:\w+>/<action:\w+>/<page:\d+>' => '<controller>/<action>',

完整版的如下:

'urlManager' => [
    'enablePrettyUrl' => true,
    'showScriptName' => false,
    'enableStrictParsing' => true,
    'suffix' => '.html',
    'rules' => [
        '<controller:\w+>/<action:\w+>/<page:\d+>' => '<controller>/<action>',
        "<controller:\w+>/<action:\w+>"=>"<controller>/<action>",
    ],
],

Url工具类的使用

URL工具类实际上只的是yii\helpers\BaseUrl类,实际写所有链接的时候,我们建议通过该类来生成链接,其好处不可言喻。

如果小张所有的链接都像下面这样写,反过来想想,他准能幸福的屁颠屁颠的。

use yii\helpers\Url;
<a href="<?= Url::to(['site/index']) ?>">Yii Forum &raquo;</a>
<a href="<?= Url::toRoute('site/index') ?>">Yii Forum2 &raquo;</a>
<a href="<?= Url::toRoute(['site/index']) ?>">Yii Forum3 &raquo;</a>

细心的同学发现了我们这里其实列举了三种写法,其效果都是一样的。尤其是使用Url::to方法,参数一定要是属组形式,属组形式的参数等同于Url::toRoute的效果。

我们的重心就转移到Url::toRoute方法上面了。该方法会根据你配置的urlManager组件去生成链接,按照我们上文中对urlManager的配置,我们再来列举两个简单的案例

<a href="<?= Url::to(['/blogs']) ?>">Yii Forum4 &raquo;</a>
<a href="<?= Url::to(['site/index', 'id' => 1]) ?>">Yii Forum5 &raquo;</a>

其生成的链接形式分别是

<a href="/index.php/blogs.html">Yii Forum4 »</a>
<a href="/index.php/site/index/1.html">Yii Forum5 »</a>

关于路由的美化与链接的生成,我们就说这么多,尤其是链接的生成需要特别注意哦,no zuo no die!

 

=================================================

Yii1.*与Yii2中配置路由规则rules是几乎是一样的,但还是有细微的差别。

 

在Yii1.*中开启path路由规则直接使用

'urlFormat' => 'path',

但在Yii2中已经没有urlFormat 对象方法,在Yii2取而代之的是

 'enablePrettyUrl'=>TRUE,

 

一个典型的Yii1.* urlManager配置:

YII2设置路由美化访问,美化url
  'urlManager' => array(
            'urlFormat' => 'path',
            'showScriptName' => false, //隐藏index.php  
            'urlSuffix' => '.html', //后缀   
            'rules' => array(
                'news/detail-<id:.*>' => 'news/detail', //http://cms.com/news/detail-27d24c26.0486c.0aea8.a3d2803b.0000111.03.html   id==>[id] => 27d24c26.0486c.0aea8.a3d2803b.0000111.03
                'news/<id:.*>-<category:\d+>' => 'news', //http://cms.com/news/02f5bc8f-04600-0b477-c6bc82ab-0000111-03-1.html ==== $this->createUrl('news/', array('id' => $value['id'],'category'=>1));  
                'singlePage/<id:.*>' => 'singlePage',  
                'contact' => 'about/contact',  
                'addOrder' => 'Online/addOrder',  
                /**
                 * $this->createUrl('news/index',array('userid'=>123,'title'=>3434,'nid'=>'sdfsdfsdf'))   index.php/new/index?userid=123&title=3434&nid=sdfsdfsdfsd
                 * http://cms.com/news/123/3434/sdfsdfsdf-index.html      
                 */
               'news/<id:\d+>/<title:.*?>/<nid:.*?>-index' => 'news/index',
                'refresh/' => 'index/Refresh',
                'index.jsp/' => 'index/',
                'index.aspx/' => 'index/',
                '<controller:\w+>/<action:\w+>' => '<controller>/<action>',
            ),
        ),
YII2设置路由美化访问,美化url

 

那Yii2如何配置呢?

首先我们的URL地址是这样的

http://new.com/index.php?r=auth%2Fmenulink&post=2

我们要让地址改为path模式:

http://new.com/auth/menulink/post/2

1.在Nginx中开启rewrite

YII2设置路由美化访问,美化url
server {
        listen       80;
        server_name  new.com ;
        location / {
            root   F:/www/new/web;
            index  index.html index.htm index.php;
            #autoindex  on;
             if (!-e $request_filename){
                rewrite ^/(.*) /index.php?r=$1 last;
            }
        }
        location ~ \.php$ {
            root          F:/www/new/web;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }
}
YII2设置路由美化访问,美化url

 

2.config中web.php 配置

YII2设置路由美化访问,美化url
'urlManager' => [
            'enablePrettyUrl' => true,  //美化url==ture
            'enableStrictParsing' => false,  //不启用严格解析 
            'showScriptName' => false,   //隐藏index.php
            'rules' => [
                '<module:\w+>/<controller:\w+>/<id:\d+>' => '<module>/<controller>/view',
                '<controller:\w+>/<id:\d+>' => '<controller>/view',
            ],
        ]
YII2设置路由美化访问,美化url

参数说明:

Yii官网说明:http://www.yiiframework.com/doc-2.0/yii-web-urlmanager.html

 

$enablePrettyUrl 

Whether to enable pretty URLs. Instead of putting all parameters in the query string part of a URL, pretty URLs allow using path info to represent some of the parameters and can thus produce more user-friendly URLs, such as “/news/Yii-is-released”, instead of “/index.php?r=news/view&id=100”.

 

$enableStrictParsing

Whether to enable strict parsing. If strict parsing is enabled, the incoming requested URL must match at least one of the $rules in order to be treated as a valid request. Otherwise, the path info part of the request will be treated as the requested route. This property is used only when $enablePrettyUrl is true.

 

$showScriptName 

Whether to show entry script name in the constructed URL. Defaults to true. This property is used only if $enablePrettyUrl is true.

 

现在访问URL就成为path模式了。

 

 

 

启用开发模式DEBUG

YII2设置路由美化访问,美化url
 if (YII_ENV_DEV) {
    // 启用开发模式DEBUG
    $config['bootstrap'][] = 'debug';
    $config['modules']['debug']['class'] = 'yii\debug\Module';
    $config['modules']['debug']['allowedIPs'] =['127.0.0.1','201.104.104.104',"::1"];
    $config['modules']['debug']['historySize'] =500;  # 修改debug记录条数

    $config['bootstrap'][] = 'gii';
    $config['modules']['gii'] ['class']= 'yii\gii\Module';
    $config['modules']['gii']['allowedIPs'] =['127.0.0.1','201.104.104.104',"::1"];
}
YII2设置路由美化访问,美化url

 

YII2设置rewrite伪静态 以及 YII2路由美化访问,美化url》有1个想法

评论已关闭。