超级无敌详细的信呼oa路由分析!!!

前言:

信呼oa的路由分析对于新手来说还是有点难以理解,刚好自己也有点混乱,所以写篇文章从头记录一下

源码下载:

https://xinhu-1251238447.file.myqcloud.com/xinhu/xinhu_utf8_v2.6.5.zip

路由分析:

首先我们搭建好网站之后打开,对于新手来说分析路由很好的一个办法就是在登陆口登录一下,看一下请求

这里我们发现他是访问的index.php文件,然后又a,m,d等参数传参了,所以我们看一下代码
然后发现开头检测rewriteurl参数内容,然后将其再传递给$_uurl参数,当它不为空走if中的代码,为空则走else,然后我们发现我们看请求包该参数是空的,所以直接看else代码

然后发现其中对m,d,a三个参数的内容都做了一个gettoken函数的处理,但是这里我们是跟不进去的我们可以直接搜索该函数的定义

然后跟进去发现就是将这三个参数放到数组里面,如果没有传递的参数内容,就按照默认的内容gettoken('m', 'index');(白费心思,还以为是过滤呢~)

那就回到index.php中继续往下看,发现把m有又传递给了mode参数,然后还多了一个ajaxbool参数,并且默认赋值为false(最用后面说)

然后跟到view.php文件中看一下,首先判断ajaxbool值是否为空,为空则赋值false

然后p是定义了一个常量webmain

然后就是又一遍的判断a,d,m是否有值,并且把给大写的M,A,D,P四个参数定义常量

然后是将m参数传递给_mc参数,如果有|,就会把|后面的内容再次赋值给_m参数

eg:m=a|c----->m=a&&_m=c
接下来就是稍微有点难以理解的地方了,他是用占位符传参

又因为ROOT_PATH是/,p是webmain,所以替换完之后就是/webmain/webmainAction.php,然后我们看一下目录发现的确有该文件

然后rand就是一个随机数,就不说了,这个是截取d字符串最后一个字符,如果不等于/并且不为空,就在d参数后面拼接一个/

然后下面又是三个占位符传参

在这里面,root_path和p都是固定的,这一段代码就是当m中有|的话,就会生成两个actfile,然后下面就是判断这两个actfile文件是否存在,并且处理a参数和m参数
如果存在第一个actfile,就会对m拼接classaction,给a拼接action,如果ajaxbool为true,就给a拼接ajax,然后访问对应文件

拿登录口的调用举例:

首先是

$actpath=/webmain/login
$actfile=/webmain/login/loginAction.php
$actfile1=/webmain/login/loginAction.php

这时候可以看一下发现在对应目录的确有该文件

然后这里的a是代表在loginAction中的方法,这时候ajaxbool是true,所以调用的是loginAction.php中的checkAjax方法

这里说明一下为什么登陆的时候d为空,这是因为在login目录下没有其他目录了,如果想要调用某目录下的某个目录下的文件,这时候就要给d赋值了
举例:
这里我们调用system目录下的cog目录下的cogAction目录
http://127.0.0.1:86/index.php?a=getinfo&d=system&m=cog&ajaxbool=true

这样就成功调用了

总结:

m代表要调用的方法所在的php文件(会自动拼接Action)
a是代表调用的方法(根据ajaxbool拼接不同内容)
d参数是当调用二级目录下的文件方法的时候才会传参

posted @ 2025-03-25 18:32  Zephyr07  阅读(46)  评论(0)    收藏  举报