[路由] -- Yii2 url地址美化与重写

来源:互联网 发布:网络营销策划的要素 编辑:程序博客网 时间:2024/06/05 03:36

第一个教程


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

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

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

复制代码
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         ],
复制代码

如果带了改了后缀这一下,请记得一定要给浏览器地址栏的路径最后面加上.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%2Findextrue:/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的匹配规则我们掌握了,但是!整个网站的链接是要我们手动写的,难不成你天天修改规则,我还要天天修改链接的写法吗?这简直就是一






0 0