phpwind的rewrite重写原理

所属分类: CMS教程 / phpwind 阅读数: 1490
收藏 0 赞 0 分享

就是一般我们用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>/**
* url处理
*
* @param string $url
* @param string $tag
* @return string
*/
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;
}

更多精彩内容其他人还在看

phpwind热榜排行最新回复排序问题

关键字描述:排序 问题 回复 最新 排行 as tid SELECT subject name 打开文件:require/rebang.php 找到以下代码: Copy code SELECT tid as id,subject as name,lastpos
收藏 0 赞 0 分享

体验PHPWind v7.3RC意外收获

关键字描述:收获 意外 体验 &mdash 用户 功能 Phpwind 建议 论坛 3月19日清晨—— 今天大清早打开,习惯的登陆phpwind官方论坛,却发现7.3RC已经开始官方演示。说实话,该演示版给我的第一印象并不友好,因为本人实
收藏 0 赞 0 分享

phpwind后台删除用户点选“直接删除”出错问题

关键字描述:删除 问题 直接 用户 后台   代码 InitGP array delid 打开:admin/superdel.php 找到一下代码(505行或者找到第三个以下代码): Copy code InitGP(array('delid'),'
收藏 0 赞 0 分享

PHPwind6.x CSS模板样式表修改帮助

关键字描述:修改 帮助 样式 模板 solid 必要 background: 1px border:1px /* 公告栏连接字体得样式 */ /*banner*/ .banner img{vertical-align:middle;} /* 头部logo的位置样式 */
收藏 0 赞 0 分享

PHPWind论坛核心设置详细说明【config.php】

关键字描述:说明 详细 设置 论坛 核心 // 是否   功能 显示 使用 此文件继续讲解4.X的data/bbscache/config.php文件内容。 此文件内容为论坛核心设置,论坛程序修改的时候同时修改数据库和本文件,配合上一篇《 PHPWind 数据库配
收藏 0 赞 0 分享

在phpwind里设置paypal贝宝网上支付获得收益

关键字描述:获得 收益 网上支付 设置 进入 贝宝 -> 注册 通知 图示 设置步骤 (一) 在 paypal 贝宝中注册一个帐户 进入 https://www.paypal.com/cn/cgi-bin/webscr?cmd=_registration-run 按照
收藏 0 赞 0 分享

巧用Discuz!7.0后台防灌水功能

关键字描述:巧用 Discuz!7.0 后台 灌水功能 BBS 论坛 康盛创想 建站产品   Discuz!7.0是康盛创想(Comsenz)公司于2008年12月份发布的一款论坛BBS建站产品。Discuz!7.0中,大大增强了论坛防灌水功能。相信很多站长都感受过论坛被
收藏 0 赞 0 分享

PHPWind7.3特色功能推荐

关键字描述:推荐 功能 特色 论坛 可以 自己 圈子 一个 用户 好友   Phpwind的7.3正式版推出了圈子的概念, 在看了具体应用后,发现他还是利用目前十分热门的SNS概念将一群人圈在了一起。装完论坛之后,圈子功能直接就内置了,意思就是说你除了可以在论坛里进行灌水
收藏 0 赞 0 分享

phpwind论坛关闭在线列表

关键字描述:在线 关闭 论坛   < EOT > " /a> index.php 使打开在线列表功能无效 打开index.php 将:if($windid==$manager || $usertotal<2000){ 这一行替换
收藏 0 赞 0 分享

phpwind7.5灵活的业务支持体系

不同的地方,民俗、经济、生活习惯都有所不同,不同的行业也有不同的规则,这就导致了不同社区有不同的资源,不同的用户,从而在社区运营和业务上有不同的侧重。作为通用型社区系统,如何更好的支持不同网站的不同业务需求是必须考虑的问题。
收藏 0 赞 0 分享
查看更多