规则路由是一种比较容易理解的路由定义方式,采用ThinkPHP设计的规则表达式来定义。

规则表达式

规则表达式通常包含静态地址和动态地址,或者两种地址的结合,例如下面都属于有效的规则表达式:

  1. 'my' => 'Member/myinfo', // 静态地址路由
  2. 'blog/:id' => 'Blog/read', // 静态地址和动态地址结合
  3. 'new/:year/:month/:day'=>'News/read', // 静态地址和动态地址结合
  4. ':user/:blog_id' =>'Blog/read',// 全动态地址

规则表达式的定义始终以“/”为参数分割符,不受URL_PATHINFO_DEPR设置的影响

每个参数中以“:”开头的参数都表示动态参数,并且会自动对应一个GET参数,例如:id表示该处匹配到的参数可以使用$_GET['id']方式获取,:year、 :month 、:day 则分别对应$_GET['year']、 $_GET['month'] 和 $_GET['day']

数字约束

支持对变量的类型检测,但仅仅支持数字类型的约束定义,例如

  1. 'blog/:id\d'=>'Blog/read',

表示只会匹配数字参数,如果你需要更加多的变量类型检测,请使用正则表达式定义来解决。

目前不支持长度约束,需要的话采用正则定义解决

函数支持

可以支持对路由变量的函数过滤,例如:

  1. 'blog/:id\d|md5'=>'Blog/read',

表示对匹配到的id变量进行md5处理,也就是说,实际传入read操作方法的$_GET['id'] 其实是 md5($_GET['id'])

注意:不支持对变量使用多次函数处理和函数额外参数传入。

可选定义

支持对路由参数的可选定义,例如:

  1. 'blog/:year\d/[:month\d]'=>'Blog/archive',

[:month\d]变量用[ ]包含起来后就表示该变量是路由匹配的可选变量。

以上定义路由规则后,下面的URL访问地址都可以被正确的路由匹配:

  1. http://serverName/index.php/Home/blog/2013
  2. http://serverName/index.php/Home/blog/2013/12

采用可选变量定义后,之前需要定义两个或者多个路由规则才能处理的情况可以合并为一个路由规则。

可选参数只能放到路由规则的最后,如果在中间使用了可选参数的话,后面的变量都会变成可选参数。

规则排除

非数字变量支持简单的排除功能,主要是起到避免解析混淆的作用,例如:

  1. 'news/:cate^add|edit|delete'=>'News/category'

3.2.2版本开始,为了避免和函数规则冲突,规则路由排除分隔符改为“-”,所以上面的路由定义需要改为: 'news/:cate^add-edit-delete'=>'News/category'

因为规则定义的局限性,恰巧我们的路由规则里面的news和实际的news模块是相同的命名,而:cate并不能自动区分当前URL里面的动态参数是实际的操作名还是路由变量,所以为了避免混淆,我们需要对路由变量cate进行一些排除以帮助我们进行更精确的路由匹配,格式^add|edit|delete 表示,匹配除了add edit 和delete之外的所有字符串,我们建议更好的方式还是改进你的路由规则,避免路由规则和模块同名的情况存在,例如

  1. 'new/:cate'=>'News/category'

就可以更简单的定义路由规则了。

完全匹配

规则匹配检测的时候只是对URL从头开始匹配,只要URL地址包含了定义的路由规则就会匹配成功,如果希望完全匹配,可以使用$符号,例如:

  1. 'new/:cate$'=> 'News/category'

http://serverName/index.php/Home/new/info

会匹配成功,而

http://serverName/index.php/Home/new/info/2

则不会匹配成功。、

大理石平台精度等级

如果是采用

  1. 'new/:cate'=> 'News/category'

方式定义的话,则两种方式的URL访问都可以匹配成功。

完全匹配的路由规则中如果使用可选参数的话将会无效。

 

thinkphp 规则路由的更多相关文章

  1. ThinkPHP URL 路由简介

    简单的说,URL 路由就是允许你在一定规则下定制你需要的 URL 样子,以达到美化 URL ,提高用户体验,也有益于搜索引擎收录的目的. 例子 原本的 URL 为: http://www.5idev. ...

  2. thinkphp 静态路由

    静态路由其实属于规则路由的静态简化版(又称为URL映射),路由定义中不包含动态参数,静态路由不需要遍历路由规则而是直接定位,因此效率较高,但作用也有限. 如果我们定义了下面的静态路由 'URL_ROU ...

  3. ThinkPHP的路由规则和URL生成,结合django的URL理解

    这个知识点,我觉得蛮重要的. 不作任何路由定义的TP,URL格式和controller之间,相当于强绑定. 路由配置,让URL和controller的关系可以自定义. URL生成,让controlle ...

  4. Thinkphp中路由Url获取的使用方法

    Thinkphp是一个体系较为完整的框架,很多地方比国外的框架功能都全,唯一不喜之处是性能,和传说中的.NET有点像. Thinkphp提供较全url处理体系,通过同一规则实现Url的路由和Url生成 ...

  5. ThinkPHP的路由形式

    首先解释一下,这里路由的意思是:系统从URL参数中分析出当前请求的分组.控制器.操作 .另外我的网址根目录是放在article目录下的,Thinkphp主要有下面几种路由形式 1.pathinfo路径 ...

  6. RabbitMQ之Topics(多规则路由)

    Exchange中基于direct类型无法基于多种规则进行路由. 例如分析syslog日志,不仅需要基于severity(info/warning/critical/error)进行路由,还需要基于a ...

  7. ThinkPHP重写路由,掩藏public/index.php

    在thinkPHP项目中,为了掩藏 public/index.php 路径时,需要修改相关的 Apache httpd.confi 文件.ThinkPHP .htaccess文件 修改 Apache ...

  8. thinkphp 正则路由

    正则路由也就是采用正则表达式定义路由的一种方式,依靠强大的正则表达式,能够定义更灵活的路由规则. 路由表达式支持的正则定义必须以“/”开头,否则就视为规则表达式.也就是说如果采用: '#^blog\/ ...

  9. thinkphp中路由的基本使用

    1.在application中下的config.php中 以下代码改为true // 是否开启路由 'url_route_on' => true, // 是否强制使用路由 'url_route_ ...

随机推荐

  1. XML中的值得注意的"坑"

    XML严禁 & < ,建议 < > & ' "进行转义 XML中预定义了5个实体引用: < > & ' " 其中,'<' ...

  2. g++优化开关(暴力必备)

    ) %:pragma GCC optimize("Ofast") %:pragma GCC optimize("inline") %:pragma GCC op ...

  3. mysql 学习之1 mysql的基本语法

    转载一位csdn中 乍得12138前辈的 转载:https://blog.csdn.net/qq_26200347/article/details/79781882

  4. 单向连通图 Going from u to v or from v to u? poj2762

    http://poj.org/problem?id=2762 强连通求子图和子图关系 + 子图关系是链式结构 #include <cstdio> #include <cstdlib& ...

  5. HashMap 介绍

    基本介绍 1. 用于存储Key-Value键值对的集合(每一个键值对也叫做一个Entry)(无顺序). 2. 根据键的hashCode值存储数据,大多数情况下可以直接定位到它的值. 3. 键key为n ...

  6. 通过网络socket获取对方 ip 和port

    int getpeername(int s, struct sockaddr *name, socklen_t *namelen);描述获取socket的对方地址struct sockaddr_in ...

  7. [HL] 7.5 集训总结

    对于某唤做赛区难度的题,我只能是内流满面..拿到题,A神题不可做,B,神题不可做,C,神题不可做...最后yy了一个A的算法...只得了20 TAT.C题骗分似乎有50 ..B题本来想骗分..然后/ ...

  8. Android源码的git下载地址

    git clone https://android.googlesource.com/device/common.git    git clone https://android.googlesour ...

  9. 取对数求阶乘位数——lightoj1045

    /* 求 n! 在base进制下的位数 取对数,用换底公式,预处理对数前缀和 b^x = n! x = log_b(n!) = log_10(n!)/log_10(b) 对x向上取整即可 */ #in ...

  10. NOIp2018集训test-9-4

    老张让我们2.5h考NOI%你题,喵喵喵? 因为今(我)天(实)的(在)题(太)鬼(弱)畜(了)了,我还只改了t1. Problem A. reorder 考试的时候大家都写了最长不降子序列,然后全员 ...