文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

phpwind的rewrite重写原理

2022-06-12 02:21

关注

就是一般我们用echo print 输出字符到页面上的时候,意味着只要执行到了echo,php就会立即输出到客户端,但php有几个和缓冲相关的函数,他可以控制你输出的行为,就是不立马输出,而是等你调用了ob_flush/flush函数,才输出。而pw就是利用了这个原理,等页面所有的内容都生成完毕了,最后调footer()时,ob_get_contents(),获取缓冲的内容,通过正则批量替换url,构造rewrite的url格式。

关于ob,其实有两种主要的使用场景,一个是实现页面压缩输出 - ob_gzhandler;再一个是在ajax/自定义api返回数据时,程序执行过程中,你不知道前面的程序是否有些意外的输出字符如空格、空行等,他们在数据返回时会造成很多意外情况,所以可以在你输出数据前,清除前面的缓冲内容,重新开始输出。

官方默认的重写规则(注:重写是web服务器 - 如apache、nginx或应用容器tomcat的功能,不是程序语言自己的功能),如pw的一条重写规则 - apache:


复制代码代码如下:

RewriteRule ^(.*)-htm-(.*)$ $1.php?$2

首先,我们分析他的构成。当我们打开 global.php 文件,找到 :


复制代码代码如下:

<?php

$db_obstart == 1 ? ob_start('ob_gzhandler') : ob_start();

?>

我们会发现,这个全局文件打开了一个ob_start,并且进行一些判断。这个是pw系统进行rewrite的一个关键。

然后我们再找到footer()函数:


复制代码代码如下:

<?php

function footer(){

global $db,$db_obstart,$db_footertime,$db_htmifopen,$P_S_T,$mtablewidth,$db_ceoconnect,$wind_version,$imgpath,$stylepath,$footer_ad,$db_union,$dbinfo,$timestamp;

Update_ol();

if($db){

$qn=$db->query_num;

}

$ft_gzip=($db_obstart==1 ? "Gzip enabled" : "Gzip disabled").$db_union[3];

if ($db_footertime == 1){

$t_array = explode(' ',microtime());

$totaltime = number_format(($t_array[0]+$t_array[1]-$P_S_T),6);

$wind_spend = "Total $totaltime(s) query $qn,";

}

$ft_time=get_date($timestamp,'m-d H:i');

include PrintEot('footer');

$output = str_replace(array('<!--<!---->','<!---->'),array('',''),ob_get_contents());

if($db_htmifopen){

$output = preg_replace(

"/<a(s*[^>]+s*)href=(["|']?)([^"'>s]+.php?[^"'>s]+)(["|']?)/ies",

"Htm_cv('3','<a1href="')",

$output

);

}

ob_end_clean();

$db_obstart == 1 ? ob_start('ob_gzhandler') : ob_start();

echo $output;

flush;

exit;

}

?>

common.php中:


复制代码代码如下:

function parseHtmlUrlRewrite($html, $flag) {

return $flag ? preg_replace("/\<a(\s*[^\>]+\s*)href\=([\"|\']?)((index|cate|thread|read|faq|rss)\.php\?[^\"\'>\s]+\s?)[\"|\']?/ies", "Htm_cv('\\3','<a\\1href=\"')", $html) : $html;

}</p> <p>

function Htm_cv($url, $tag) {

return stripslashes($tag) . urlRewrite($url) . '"';

}</p> <p>function urlRewrite($url) {

global $db_htmifopen, $db_dir, $db_ext;

if (!$db_htmifopen) return $url;

$tmppos = strpos($url, '#');

$add = $tmppos !== false ? substr($url, $tmppos) : '';

$turl = str_replace(array('.php?', '=', '&amp;', '&', $add), array($db_dir, '-', '-', '-', ''), $url);//pw的重写规则在这里进行字符的替换

$turl != $url && $turl .= $db_ext;

return $turl . $add;

}

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯