Discuz!官方免费开源建站系统

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

X2 下 URL 静态化的实现方法

[复制链接]
beijing200808 发表于 2011-5-19 12:17:19 | 显示全部楼层 |阅读模式
本帖最后由 beijing200808 于 2011-5-19 12:27 编辑

在后台 => 全局 => SEO设置=> URL 静态化,开启各个页面的静态化后,在站点界面上,可以看到所有的链接都变成静态地址格式。下面我们看一下这个过程是怎么实现的。(以主题列表页为例)
众所周知,Discuz!在页面打开前,先进行逻辑运算,然后引用模板的缓存文件,显示在屏幕上。在逻辑运算部分,不涉及URL 格式的操作,只是处理URL的组成元素,比如fidtid等。
再看一下模板文件,找到template\default\forum\forumdisplay_list.htm 文件,可以看到里面的主题列表项依然是动态地址格式,如下
  1. <a href="forum.php?mod=viewthread&tid=$thread[tid]&{if $_G['gp_archiveid']}archiveid={$_G['gp_archiveid']}&{/if}extra=$extra"$thread[highlight]{if $thread['isgroup'] == 1 || $thread['forumstick']} target="_blank"{else} onclick="atarget(this)"{/if} class="xst" >$thread[subject]</a>
复制代码
最后,我们再去这部分的缓存文件中去找一下,打开data\template\1_diy_forum_forumdisplay.tpl.php,找到
  1. <a href="forum.php?mod=viewthread&tid=<?php echo $thread['tid'];?>&<?php if($_G['gp_archiveid']) { ?>archiveid=<?php echo $_G['gp_archiveid'];?>&<?php } ?>extra=<?php echo $extra;?>"<?php echo $thread['highlight'];?><?php if($thread['isgroup'] == 1 || $thread['forumstick']) { ?> target="_blank"<?php } else { ?> onclick="atarget(this)"<?php } ?> class="xst" ><?php echo $thread['subject'];?></a>
复制代码
可以看到,依然是动态地址。但是在文件的最后,有一段代码

  1. <?php output();?></body>
复制代码

这个 output 函数就是用来控制页面地址显示方式。其实,它原始代码在模板 footer.html 中
  1. <!--{eval output();}-->
  2. </body>
复制代码
我们看一下 output 函数,打开 source\function\function_core.php 文件,找到 function output 中的
  1. if($_G['setting']['rewritestatus'] || !empty($havedomain)) {
  2.        $content = ob_get_contents();
  3.        $content = output_replace($content);


  4.        ob_end_clean();
  5.        $_G['gzipcompress'] ? ob_start('ob_gzhandler') : ob_start();

  6.        echo $content;
  7. }
复制代码
当后台开启URL静态化后,页面的输出内容会被 output_replace 进行处理,在 output_replace 函数中,
  1. if(!empty($_G['setting']['output']['preg']['search'])) {
  2.         if(empty($_G['setting']['domain']['app']['default'])) {
  3.                 $_G['setting']['output']['preg']['search'] = str_replace('\{CURHOST\}', preg_quote($temp['host']), $_G['setting']['output']['preg']['search']);
  4.                 $_G['setting']['output']['preg']['replace'] = str_replace('{CURHOST}', $temp['host'], $_G['setting']['output']['preg']['replace']);
  5.         }
  6.         $content = preg_replace($_G['setting']['output']['preg']['search'], $_G['setting']['output']['preg']['replace'], $content);
  7. }
复制代码
通过这段代码进行动态地址和静态地址间的替换。其中 $_G['setting']['output'] 中是后台设置的URL静态化规则。 output_replace 函数处理完后,将替换后的内容返回,返回结果通过 output 函数直接显示出来。

至此,站点界面上的地址将显示成静态地址。



64243354 发表于 2011-5-19 19:18:05 | 显示全部楼层
老大的帖子不支持不行
回复

使用道具 举报

windf 发表于 2011-5-19 20:42:12 | 显示全部楼层
修改的文件倒是不多能不能直接给个覆盖的文件
回复

使用道具 举报

醒木 发表于 2011-5-20 09:18:29 | 显示全部楼层
有点太深奥了!
能不能通俗易懂一点?!
回复

使用道具 举报

pannysp 发表于 2011-5-20 10:45:39 | 显示全部楼层
我论坛里的DIY数据显示,有些是静态,有些却还是没静态化的URL,怎么回事
回复

使用道具 举报

kingilin 发表于 2011-5-20 12:54:37 | 显示全部楼层
看不懂了。
回复

使用道具 举报

llgwl 发表于 2011-5-21 12:14:15 | 显示全部楼层
神奇的就像变魔术一样
回复

使用道具 举报

winner-php 发表于 2011-5-21 14:10:49 | 显示全部楼层
回复

使用道具 举报

apollo2010 发表于 2011-5-21 20:02:55 | 显示全部楼层
等会儿去后台瞧瞧!~~
回复

使用道具 举报

ybs885 发表于 2011-5-21 20:06:20 | 显示全部楼层
瓦不错。。。这教程不错!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|Discuz! 官方站 ( 皖ICP备16010102号 )star

GMT+8, 2024-11-17 08:42 , Processed in 0.039143 second(s), 3 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表