zoukankan      html  css  js  c++  java
  • 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()函数了。

  • 相关阅读:
    iOS下的四舍五入
    下载私有库 classdump命令 privateFrameworks
    苹果账号下添加测试设备
    新的Mac下如何配置开发者账号信息
    open开发笔记
    C#面向对象基础抽象类
    C#面向对象基础继承
    C#面向对象基础接口
    C#面向对象基础对象引用
    COJ1165(Nearest Numbers)
  • 原文地址:https://www.cnblogs.com/smallmuda/p/2308106.html
Copyright © 2011-2022 走看看