前言
意义:隐藏真实的项目地址(防止非法入侵的人直接获取真实的项目地址)
方便用户的记忆,起到见名之意的效果
更适合搜索引擎的优化
注意:1.使用路由定义时,入口文件依然需要在url中来写,如果需要隐藏入口文件,需要配合Apache或者Nginx这类发布容器来进行隐藏,只需要修改配置文件(重写规则)即可;
而路由是框架来定义的,所以放到Apache和nginx都好使,所有一般隐藏入口文件用Apache或者nginx的重写功能(Rewrite)来完成;具体的路由都按照框架的路由方式来定义。2.如果要隐藏入口文件,在apache环境下可以使用
.htaccess
文件来隐藏,但5.6以上版本需要把规则改成RewriteRule ^(.*)$ index.php?/$1 [QSA,PT,L]
规则:多条路由执行时,后面相同规则会覆盖前面的
不用的规则,但解析的结构相同时,先解析的先执行
\think\Route::rule('路由表达式','路由地址','请求类型',[路由参数],[变量规则]);
tp5路由的三种模式:
【普通模式】
path_info访问
//设置
'url_route_on' => false,
// 按照顺序解析变量
'url_param_type' => 1,
路由关闭后,不会解析任何路由规则,采用默认的PATH_INFO
模式访问URL
【混合模式】
开启路由,并使用路由定义+默认PATH_INFO
方式的混合
'url_route_on' => true,
'url_route_must'=> false,
【强制路由】
开启路由,并设置必须定义路由才能访问
'url_route_on' => true,
'url_route_must' => true,
动态注册
think\Route::rule('index/:id','index/News/read')
参数1:路由表达式
'/' => 'index', // 首页访问路由
'my' => 'Member/myinfo', // 静态地址路由
'blog/:id' => 'Blog/read', // 静态地址和动态地址结合
'new/:year/:month/:day'=>'News/read', // 静态地址和动态地址结合
':user/:blog_id'=>'Blog/read',// 全动态地址
首页:/
静态地址:直接以字符串来定义
动态地址:以冒号开始后面跟着变量名,相当于给静态地址传入一个pathinfo
的参数,参数名就是变量名
可选定义:如果像省略不写=》[]
可选参数只能放到路由规则的最后,如果在中间使用可选参数那后面的变量也都变成可选参数(在tp中可能会报错误控制器不存在)
完全匹配:如果希望完全匹配,可以在路由表达式最后使用$符号;
如果不加完全匹配,可能出现前半部分与路由表达式匹配成功,后面又添加了一些参数,也能(错误的)匹配成功;
//开启路由定义的全局完全匹配
'route_complete_match' => true,
额外参数:类似隐式传参,但是通过url方式传递的参数,只是外界看不到,可以进行一些安全的防范;
例如:传参配合自动注入+静动态地址结合
//route.php
\think\Route::rule('path/:id','index/Index/pu');
//Index.php
public function pu($id){
echo $id.'<br>';
return '动态注册';
}
//访问; shop.com/path/233
路由参数(数组)第四个参数的两种写法
//方法1
\think\Route::rule('rt/[:id]','index/Index/ob','get',[],['id'=>'\d+'])//rt/11
//方法2
\think\Route::get('rt/[:id]','index/Index/ob',['method' => 'get'],[],['id'=>'\d+'])//rt/11
参数2:路由地址
路由到达的目标(代码)
5中定义方式:
定义方式 | 定义格式 |
---|---|
方式1:路由到模块/控制器 | '[模块/控制器/操作]?额外参数1=值1&额外参数2=值2...' |
方式2:路由到重定向地址 | '外部地址'(默认301重定向) 或者 ['外部地址','重定向代码'] |
方式3:路由到控制器的方法 | '@[模块/控制器/]操作' |
方式4:路由到类的方法 | '\完整的命名空间类::静态方法' 或者 '\完整的命名空间类@动态方法' |
方式5:路由到闭包函数 | 闭包函数定义(支持参数传入) |
方式1和方式3的区别:
方式1会初始化模块(通过对模块内的配置想是否读取就能进行验证);
方式3仅仅是路由到控制器的方法,模块不会被初始化;换句话这时候控制器类似于普通的类文件方式3会调用应用类
方式4只会使用第三方类
参数3:请求类型
get和post
put和Delete{Restful}
any(*)
请求参数大写
多个类型用| 竖线分割。比如GET|POST
参数4:路由参数
对路由的规则进行参数的限制或者定义
详细参数(数组)见tp官方手册
https://www.kancloud.cn/manual/thinkphp5/118034
行为层必须使用run方法
比如建立文件application\behavior\UserCheck.php
<?php
namespace app\index\behavior;
class UserCheck{
public function run(){
echo request()->url();
if('/fn/0' ==request()->url()){
return false;
}
}
}
栗子:
\think\Route::any('url',function(){
return "url";
},['htpps'=>true]);
\think\Route::any('fq',function(){
return "fq";
},['callback'=>'my_check_fun']);
\think\Route::any('fqq',function(){
return "fqq";
},['before_behavior'=>'\app\index\behavior\UserCheck']);
参数5:变量规则
针对的是路由表达式中的动态参数来指定对应参数的规则(参该如何写,通常为正则表达式来设定)
全局变量规则:针对每条路由规则中的参数单独定义
局部变量规则:针对每条路由规则中的对应参数进行定义
完整URL规则:如果要对整个URL进行规则检查,可以进行__url__
变量规则,例如:
['__url__'=>'new\/\w+$']
栗子:
//方式1
\think\Route::pattern('name','\d+');
//方式2(局部定义-常用)
\think\Route::rule('new/:na',function($na){
return "OK:".$na;
},'GET|POST',[],['__url__'=>'new\/\w+$']);
组合变量
在定义某些特殊路由规则是可以使用组合变量
例如Route::get('item-<name>-<id>','index/detail',[],['name'=>'\w+','id'=>'\d+']);
使用闭包测试栗子:
//浏览器输入http://网址/date/abc05
\think\Route::rule('date/<na><id>',function($na,$id){
return $id."=>".$na;
},'GET|POST',[],['na'=>'[a-zA-Z]+','id'=>'[0-5]+']);
//浏览器输入http://网址/datee/abc-05
\think\Route::rule('datee/<na>-<id>',function($na,$id){
return $id."<=组合变量=>".$na;
},'GET|POST',[],['na'=>'\w+','id'=>'[0-5]+']);
批量注册
方式一:将理由表达式的参数通过数组方式定义,键名为路由表达式,键值为里有地址;规则中的路由地址由空字符串占位,其他参数不遍;
方式二:通过配置文件的return数组形式定义,关联数组的键名为路由表达式:
键值为索引数组,形式为[路由地址(5种),路由参数(数组),变量规则(数组)]
'__pattern__'
为全局变量规则,具体规则用关联数组来定义[变量名=>变量规则]
栗子:
//访问浏览器
//http://地址/blog/15.html
//http://地址/bg2.html
//http://地址/bg3/abc/15.html
return [
'blog/:id' =>['blog',['ext'=>'html'],['name'=>'[a-zA-Z]+','id'=>'[0-5]+']],
'bg2'=>['@index/Index/bg23',['ext'=>'html'],['name'=>'[a-zA-Z]+','id'=>'[0-5]+']],
'bg3/:name/:id'=>['bg24',['method'=>'get|post','ext'=>'html'],['name'=>'[a-zA-Z]+','id'=>'[0-5]+']],
];
快捷路由
直接为控制器定义一个路由规则,每个方法的名字为请求类型+方法名(驼峰法命名)
// 给Index控制器设置快捷路由
Route::controller('in','index/Index');
创建类库文件(自动生成一下方法)>php think make:controller index/User
namespace app\index\controller;
class User {
public function getInfo(){}
public function getPhone(){}
public function postInfo(){}
public function putInfo(){}
public function deleteInfo(){}
}
//通过一下方式访问
//get http://localhost/user/info
//get http://localhost/user/phone
//post http://localhost/user/info
//put http://localhost/user/info
//delete http://localhost/user/info
路由别名
路由别名功能可以使用一条规则,批量定义一系列的路由规则。
// user 别名路由到 index/User 控制器
\think\Route::alias('user','index/User');
//或者
return [
'__alias__' => [
'user' => 'index/User',
],
];
//访问方式:
//http://serverName/index.php/user/add
//http://serverName/index.php/user/edit/id/5
//http://serverName/index.php/user/read/id/5
// user 路由别名指向 User控制器类
Route::alias('user','\app\index\controller\User');
// user 别名路由到 index/user 控制器
Route::alias('user','index/user',['ext'=>'html']);
路由别名不支持变量类型和路由条件判断,单纯只是为了缩短URL地址,并且在定义的时候需要注意避免和路由规则产生混淆。
路由分组
路由分组功能允许把相同前缀的路由定义合并分组,这样可以提高路由匹配的效率,不必每次都去遍历完整的路由规则。
我的理解是建立一个2级路由然后组内的路由规则可以统一定义管理方便。
设置公共的路由参数栗子:
//访问浏览器
//http://地址/group/15.html
//http://地址/group/bg2.html
//http://地址/group/bg3/abc/15.html
\think\Route::group('goods',[
'blog/:id' => ['blog'],
'bg2'=>['@index/Index/bg23'],
'bg3/:name/:id'=>['bg24'],
],['method'=>'get|post','ext'=>'html'],['name'=>'[a-zA-Z]+','id'=>'[0-5]+']);
使用闭包方式注册路由分组栗子:
\think\Route::group('blog',function(){
Route::any(':id','blog/read',[],['id'=>'\d+']);
Route::any(':name','blog/read',[],['name'=>'\w+']);
},['method'=>'get','ext'=>'html']);
//或者
\think\Route::group(['method'=>'get','ext'=>'html'],function(){
Route::any('blog/:id','blog/read',[],['id'=>'\d+']);
Route::any('blog/:name','blog/read',[],['name'=>'\w+']);
});
路由分组嵌套栗子:
\think\Route::group(['method'=>'get','ext'=>'html'],function(){
Route::group('blog',function(){
Route::any('blog/:id','blog/read',[],['id'=>'\d+']);
Route::any('blog/:name','blog/read',[],['name'=>'\w+']);
}
});
MISS路由
如果希望在没有匹配到所有的路由规则后执行一条设定的路由,可以使用MISS
路由功能,只需要在路由配置文件中定义
return [
'new/:id' => 'News/read',
'blog/:id' => ['Blog/update',['method' => 'post|put'], ['id' => '\d+']],
'__miss__' => 'public/miss',
];
//或者使用miss方法注册路由
\think\Route::miss('public/miss');
也可以写在分组路由配置中
路由绑定
可以使用路由绑定简化URL或者路由规则的定义
不建议用和其他路由规则冲突
- 绑定到模块/控制器/操作
// 绑定当前的URL到 index模块
\think\Route::bind('index');
// 绑定当前的URL到 index模块的blog控制器
\think\Route::bind('index/blog');
// 绑定当前的URL到 index模块的blog控制器的read操作
\think\Route::bind('index/blog/read');
- 绑定到命名空间
// 绑定命名空间
\think\Route::bind('\app\index\controller','namespace');
//访问http://地址/index/Blog/read
- 绑定到类
// 绑定到类
\think\Route::bind('\app\index\controller\Blog','class');
//http://地址/read/id/5
- 入口文件绑定
见手册介绍:https://www.kancloud.cn/manual/thinkphp5/118040
资源路由
\think\Route::resource('blog','index/blog');
//或者
return [
// 定义资源路由
'__rest__'=>[
// 指向index模块的blog控制器
'blog'=>'index/blog',
],
// 定义普通路由
'hello/:id'=>'index/hello',
]
设置后会自动注册7个里有规则
标识 | 请求类型 | 生成路由规则 | 对应操作方法(默认) |
---|---|---|---|
index | GET | blog | index |
create | GET | blog/create | create |
save | POST | blog | save |
read | GET | blog/:id | read |
edit | GET | blog/:id/edit | edit |
update | PUT | blog/:id | update |
delete | DELETE | blog/:id | delete |
访问方法:
http://域名/blog/
http://域名/blog/128
http://域名/blog/28/edit
创建类库文件(自动生成上面7个方法)>php think make:controller index/User
URL生成
ThinkPHP5.0支持路由URL地址的统一生成,并且支持所有的路由方式,以及完美解决了路由地址的反转解析,无需再为路由定义和变化而改变URL生成。
Url::build('地址表达式',['参数'],['URL后缀'],['域名'])
url('地址表达式',['参数'],['URL后缀'],['域名'])
地址表达式和参数
//定义一个路由规则
\think\Route::rule('blog/[:abc]$','index/Index/blog2');
\think\Route::rule('ver','@index/Index/ver');
//用以下方式生成url地址
echo Url::build('index/Index/blog2',['abc'=>'aabbcc'],'',true);
echo Url::build('@index/Index/ver',['abc'=>'aabbcc'],'',true);
//最后输出结果
/*
http://shop18/blog/aabbcc
http://shop18/ver/abc/aabbcc
*/
- 使用模块/控制器/操作生成
// 生成index模块 blog控制器的read操作 URL访问地址
Url::build('index/blog/read','id=5&name=thinkphp');
// 使用助手函数
url('index/blog/read','id=5&name=thinkphp');
- 使用类的方法生成
//定义动态路由规则
\think\Route::rule(['verify','ver'],'\app\index\controller\Index@ver');
\think\Route::rule(['zx','zx'],'\com\zx\Zhuoxiang::showMsg?id=123');
//用以下方式生成url地址
echo Url::build('verify',['name'=>'zhangsan'],'',true);
echo Url::build('zx',['name'=>'zhangsan'],'',true);
//最后输出结果
//http://shop18/ver/name/zhangsan
//http://shop18/zx/name/zhangsan
URL后缀
//默认情况下,系统会自动读取url_html_suffix配置参数作为URL后缀(默认为html)
'url_html_suffix' => 'shtml'
//生成地址为:/index.php/blog/5.shtml
//设置支持多个后缀
'url_html_suffix' => 'html|shtml'
//指定URL后缀生成
Url::build('index/blog/read','id=5','shtml');
url('index/blog/read','id=5','shtml');
评论