来源: 梧桐树下 作者: 梧桐树下
关于apache的url ReWrite的争议,并不在本篇文章的探讨范围之内,如果你认为rewrite对你的工作并没有任何的帮助或者你并没有权限控制apache,那么我建议你不用看这篇文章。另外,rewrite模块启用必须是在你以module方法安装php的基础下进行的。如果你并不清楚如何以module模式安装 php,请你自行阅读php文件夹中的 INSTALL 文档。
为什么选择pw来讲rewrite控制而非dz,是因为有人说过“phpwind“在技术是成功的,而dz在商业上成功的,我同意这些话。本人在阅读pw 的代码中受益非浅。并且在rewrite的控制中,pw做得远远比dz好。当然,你可以认为我在胡扯。我并不反对你对我的说法持反对意见,因为我毕竟不是权威。不过,我认为,无论你是新手,还是已经有了基础的phper,pw的源码都是应该读一下的,相信我,会带给你许多意想不到的收获。
好了,闲话不再多话,现在开始进行正题。
OK,首先我们安装一下phpwind论坛,如果你没有,请自行去下载最新版本,他的官方地址是:phpwind.net。
安装成功后,我们进行后台。我们找到 "静态目录部署" 并点击,会出现phpwind的进行部署rewrite的一些信息。先按照此说明进行 httpd.conf 文档修改。在这里请注意,如果你的apache是2.x版本的,你可以直接这样进行布署:
- LoadModule rewrite_module libexec/mod_rewrite.so
- RewriteEngine On
- RewriteRule ^(.*)-htm-(.*)$ $1.php?$2
复制代码如果是1.x版本,请按官方说明。
重新启动你的apache后之后,你可以在 "静态目录部署" 选择中进行配置了。
是否开启静态目录部署功能:是
静态目录 : -htm-
静态目录扩展名设置 : .html
注:这里的静态目录其实就是咱们在进行 RewruteRule 中的 ^(.*)-htm- 这个地方的,你必须要保证这个重写方案与你配置的是一样的。扩展名是无所谓的。你可以随意命名。
我们回到前台,当你打开一个子论坛或者一个贴子时,你会发现,地址已经变成了 http://localhost/phpwind/thread-htm-fid-2.html 了。这个是我们这篇文章的主题。
OK,我们开始进行分析。
首先,我们分析他的构成。当我们打开 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\',\'<a\\1href=\"\')",
- $output
- );
- }
- ob_end_clean();
- $db_obstart == 1 ? ob_start(\'ob_gzhandler\') : ob_start();
- echo $output;
- flush;
- exit;
- }
- ?>
复制代码不难看出,pw在这里进行了一个判断: $db_htmifopen,关于这个变量的来历,如果大家有兴趣,以后有机会我会再写关于pw的cache控制的文章。现在你可以直接打开你的 /phpwind/data/bbscache/config.php 文件,查看是否已经设置。这个文件是由pw的缓存函数生成。
也就是说,如果这个开关被打开,那么将通过 Htm_cv 函数开始将重新对输入进行正则替换。将所有本域下的php文件链接变成咱们通过url看到的类似于 thread-htm-fid-2.html 这样的链接。当然,这个并不是本文的重点,这只是一种替换而已。
此时,如果你打印 $_GET 数组,我们可能得到这样一种结果:
- <?php
- Array
- (
- [fid-2_html] =>
- )
- ?>
复制代码现在问题出来了,我们如何将上面的参数转换成我们所需要的 :
- <?php
- Array
- (
- [fid] => 2
- )
- ?>
复制代码而被PHP正解解释呢?
OK,接下来,我们分析这个文件:/phpwind/require/defend.php。