分享好友 cms教程首页 频道列表

phpwind的rewrite重写原理

phpwind教程  2015-08-01 17:340

就是一般我们用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教程】的文章

展开全文
相关推荐
反对 0
举报 0
评论 0
图文资讯
热门推荐
优选好物
更多热点专题
更多推荐文章
Phpwind7.5应用中心:基础、第三方在线应用等设置
应用中心:基础、第三方在线应用、各种特殊功能帖的设置。它包括:

0评论2015-08-18197

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

0评论2015-08-18193

phpwind后台删除用户点选“直接删除”出错问题
关键字描述:删除 问题 直接 用户 后台   代码 InitGP array delid 打开:admin/superdel.php 找到一下代码(505行或者找到第三个以下代码): Copy code InitGP(array('delid'),'P'); 替换为一下代码: Copy code if (!$_POST['direct']) {

0评论2015-08-18126

PHPwind6.x CSS模板样式表修改帮助
关键字描述:修改 帮助 样式 模板 solid 必要 background: 1px border:1px /* 公告栏连接字体得样式 */ /*banner*/ .banner img{vertical-align:middle;} /* 头部logo的位置样式 */ /*guide*/ .guide{background:$cbgcolor url($imgpath/$stylepath/guide.gif) 0 bo

0评论2015-08-18212

phpwind 系统强制您所在的用户组必须设置安全问题
关键字描述:设置 安全 问题 必须 系统 强制 所在 ...   后台 phpwind前面设置安全问题的时候不小心把管理员也选进去了! 现在不能进后台了! 论坛前面又正好关着!没办法改问题...Orz 请问要怎么处理? 就是新出的那个...像Discuz一样登陆时的安全问题 后台登陆它说

0评论2015-08-02166

phpwind 今日发贴数量不显示解决
关键字描述:解决 显示 数量 今日 设置 倒数第二 下面 即可 找到 希望 今日数量发贴不显示! 不知道怎么搞 请高手说明白点 谢谢了`! 核心设置—首页细节设置 找到最下面倒数第二个设置即可! 希望能帮助您解决问题,呵呵。

0评论2015-08-02155

phpwind发帖 自动分析url|使用签名如何默认不选中
关键字描述:签名 如何 默认 使用 发帖 自动 分析 " < checked 怎样才能在发帖的时候,自动分析url|使用签名 这两项是默认不选中呢? post.htm这个文件: <span><input type="checkbox" name="atc_autourl" value="1" chec

0评论2015-08-02101

无心宠物2.3 PHPWIND7.0/6.X通用版插件
关键字描述:通用 插件 宠物 目录 论坛 设置 文件 中心 上传 后台 无心宠物2.3 PHPWIND7.0/6.X通用版插件 安装方法: 1.上传Web目录下所有文件到网站论坛的根目录下。 2..解压缩宠物图片包,把图片Pet目录下所有文件上传到论坛的wxpet/images下 3.上传pet_in

0评论2015-08-02120

phpwind快速发帖时插入附件弹出空白提示框
关键字描述:空白 提示 附件 插入 快速 发帖 code Copy 找到 alert phpwind快速发帖时插入附件弹出空白提示框 打开: js/upload.js 找到: Copy code alert(sel.text); 删除该代码

0评论2015-08-02150

phpwind热榜排行最新回复排序问题
关键字描述:排序 问题 回复 最新 排行 as tid SELECT subject name 打开文件:require/rebang.php 找到以下代码: Copy code SELECT tid as id,subject as name,lastpost as value FROM pw_threads WHERE tid IN($tids) 替换为以下代码: Copy code SELE

0评论2015-08-02109

phpwind版主推荐权限问题
关键字描述:问题 权限 推荐   foruminfo windid CkInArray if phpwind版主推荐权限问题 打开文件:masingle.php 找到以下代码: Copy code /** * 获取创始人和版主权限 */ if (CkInArray($windid,$manager) || admincheck($foruminfo['forum

0评论2015-08-02141

phpwind护身符道具不过期问题
关键字描述:问题 不过 道具   > uid " Showmsg & if 打开:hack/toolcenter/require/defend.php 整个文件内容替换为一下代码: Copy code <?php !function_exists('readover') && exit('Forbidden'); /**** @name:护身符 @type:会员

0评论2015-08-02170

无心宠物帖子内显示(玫瑰花 版)for pw6.0
关键字描述:显示 宠物 帖子 < > read " height width 功能说明: 除了在个人资料显示宠物信息外,增加在论坛ID右侧显示玫瑰花数量,玫瑰花由宠物系统打怪获得,也可以在特殊商店或普通商店出售。会员打到或购买玫瑰花后赠送给谁,就显示在谁的用户名右侧。 效

0评论2015-08-02129

phpwind前台银行操作日志链接问题
关键字描述:链接 问题 日志 操作 前台 银行 " rt sum basename& 打开:hack/bank/index.php 查找: Copy code $pages = numofpage($rt['sum'],$page,ceil($rt['sum']/$db_perpage),"$basename&action=log&type=$type&"); 修改

0评论2015-08-02173

PHPWind7.0风格css样式详解
关键字描述:详解 样式 风格 solid 必要   修改 padding:0 margin:0 body{font-size:9pt; background:url($imgpath/$stylepath/bodybg.gif) repeat-x ; font-family:Verdana; color:#333} /*网页页面定义:依次定义了字体大小,背景,字体样式,字体颜色*/ h1,h2,h

0评论2015-08-02178

phpwind系统头像无效问题
关键字描述:问题 无效 系统 user_a faceurl < if & false strpos phpwind系统头像无效问题 打开:require/showimg.php 查找: Copy code if (!$faceurl || !$user_a[0] || strpos($faceurl,'<')!==false || $user_a[1]<1) { 修改为: Copy code

0评论2015-08-02110

体验PHPWind v7.3RC意外收获
关键字描述:收获 意外 体验 &mdash 用户 功能 Phpwind 建议 论坛 3月19日清晨—— 今天大清早打开,习惯的登陆phpwind官方论坛,却发现7.3RC已经开始官方演示。说实话,该演示版给我的第一印象并不友好,因为本人实在不喜欢窄屏的风格。于是,带着丝

0评论2015-08-02110

phpwind的wap中帖子访问权限问题
关键字描述:权限 问题 访问 帖子 fm & fid " groupid allowvisit 1.打开:wap/global.php 查找函数: Copy code function forumcheck($fid,$type) { global $db,$groupid,$gp_allowrp; $fm = $db->get_one("SELECT password,allowvisit,allo

0评论2015-08-02148

phpwind解决搜索到回收站中内容的问题
关键字描述:内容 问题 回收 搜索 解决 query locked replies hits 打开:search.php 查找: Copy code $query = $db->query("SELECT tid,fid,titlefont,author,authorid,subject,postdate,lastpost,lastposter,hits,replies,locked,special,anonymous

0评论2015-08-02118

更多推荐