UCHome下伪静态的实现及路径解析

仅适用于程序可以通过独立域名或者二级域名直接访问。

如果您的程序需要域名后面加目录名(比如:xxxxx)的方式才可以访问,那么,您需要手工修改以下规则:
将 “RewriteBase /” 修改为 “RewriteBase /xxxxx”
其中,“xxxxx” 为您的程序目录名

01.<IfModule mod_rewrite.c>
02. 
03.RewriteEngine On
04. 
05.RewriteBase /UCHome
06. 
07.RewriteRule ^(space|network)\-(.+)\.html$ $1.php?rewrite=$2 [L]
08. 
09.RewriteRule ^(space|network)\.html$ $1.php [L]
10. 
11.RewriteRule ^([0-9]+)$ space.php?uid=$1 [L]
12. 
13.</IfModule>

添加内容时,请遵照上面的提示,修改程序所在的路径
然后保存为文件 .htaccess 。将 .htaccess 文件上传到程序所在的目录中
进入站点设置,根据需要开启 URL 静态化功能.

虽然这样子已经能够使url伪静态话了,但是要是你注意看的话,会发现一点,那就是在我们伪静态话之前和静态化之后,页面所有文件的链接地址都是没有改变的,但是,在进行伪静态处理之后,当我们把鼠标放在相关的链接上面时,链接的地址已经发生了变化,但是,查看源文件还是没有变化的。这是什么原因呢??

找了好长时间,终于知道是什么原因了。
在要进行伪静态处理的space.php文件中,我们可以看到如下代码:

01.if($_SCONFIG['allowrewrite'] && isset($_GET['rewrite'])) {
02.$rws explode('-'$_GET['rewrite']);
03.if($rw_uid intval($rws[0])) {
04.$_GET['uid'] = $rw_uid;
05.else {
06.$_GET['do'] = $rws[0];
07.}
08.if(isset($rws[1])) {
09.$rw_count count($rws);
10.for ($rw_i=1; $rw_i<$rw_count$rw_i=$rw_i+2) {
11.$_GET[$rws[$rw_i]] = empty($rws[$rw_i+1])?'':$rws[$rw_i+1];
12.}
13.}
14.unset($_GET['rewrite']);
15.}

这是获取伪静态并进行处理的相关代码。将获取到的值复值给相关的变量,留给后续的程序执行,这里并没有什么。
需要注意的是$_SCONFIG['allowrewrite'],这个配置项是在UCHome的后台开启的。这些并没有什么不能明白的。但是那个链接的地址到底是怎么回事呢?
我们找到文件function_common.php文件。这个文件里面有个函数ob_out();如下:

01.function ob_out() {
02.global $_SGLOBAL$_SCONFIG$_SC;
03. 
04.$content = ob_get_contents();
05. 
06.$preg_searchs $preg_replaces $str_searchs $str_replaces array();
07. 
08.if($_SCONFIG['allowrewrite']) {
09.$preg_searchs[] = "/\<a href\=\"space\.php\?(uid|do)+\=([a-z0-9\=\&]+?)\"/ie";
10.$preg_searchs[] = "/\<a href\=\"space.php\"/i";
11.$preg_searchs[] = "/\<a href\=\"network\.php\?ac\=([a-z0-9\=\&]+?)\"/ie";
12.$preg_searchs[] = "/\<a href\=\"network.php\"/i";
13. 
14.$preg_replaces[] = 'rewrite_url(\'space-\',\'\\2\')';
15.$preg_replaces[] = '<a href="space.html"';
16.$preg_replaces[] = 'rewrite_url(\'network-\',\'\\1\')';
17.$preg_replaces[] = '<a href="network.html"';
18.}
19.if($_SCONFIG['linkguide']) {
20.$preg_searchs[] = "/\<a href\=\"http\:\/\/(.+?)\"/ie";
21.$preg_replaces[] = 'iframe_url(\'\\1\')';
22.}
23. 
24.if($_SGLOBAL['inajax']) {
25.$preg_searchs[] = "/([\x01-\x09\x0b-\x0c\x0e-\x1f])+/";
26.$preg_replaces[] = ' ';
27. 
28.$str_searchs[] = ']]>';
29.$str_replaces[] = ']]&gt;';
30.}
31. 
32.if($preg_searchs) {
33.$content = preg_replace($preg_searchs$preg_replaces$content);
34.}
35.if($str_searchs) {
36.$content = trim(str_replace($str_searchs$str_replaces$content));
37.}
38. 
39.obclean();
40.if($_SGLOBAL['inajax']) {
41.xml_out($content);
42.else{
43.if($_SCONFIG['headercharset']) {
44.@header('Content-Type: text/html; charset='.$_SC['charset']);
45.}
46.echo $content;
47.if(D_BUG) {
48.@include_once(S_ROOT.'./source/inc_debug.php');
49.}
50.}
51.}

这个函数是在parse_template()函数里面被调用的。看如下代码:

1.//换行
2.$template = preg_replace("/ \?\>[\n\r]*\<\? /s"" "$template);
3. 
4.//附加处理
5.$template "<?php if(!defined('IN_UCHOME')) exit('Access Denied');?><?php subtplcheck('".implode('|', $_SGLOBAL['sub_tpls'])."','$_SGLOBAL[timestamp]''$tpl');?>$template<?php ob_out();?>";

在所有的模板解析完成之后,调用函数ob_out(),判断当前的系统有没有开启Rewrite,如果开启了则进行相关正则替换,实现我们开启了伪静态之后看到的那个链接效果。

这个过程中最重要的步骤就是那个ob_out()函数了。

posted @ 2011-12-30 23:02  苔苔以苔苔以苔  阅读(732)  评论(0编辑  收藏  举报
猪先飞