·设为首页收藏本站📧邮箱修改🎁免费下载专区💎积分✅卡密📒收藏夹👽聊天室
返回列表 发布新帖

discuz论坛伪静态原理分析记录

293 0
发表于 2022-5-19 18:56:39 | 查看全部 阅读模式

马上注册,免费下载更多dz插件网资源。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
伪静态是如何在论坛显示出来的?

为什么我的站伪静态开启了,但在首页还是显示动态链接呀?那么下面讲解下,伪静态是如何显示出来的。

了解discuz!的同学应该知道,在论坛模板文件中,所以的url链接都是以动态的形式返回输出的。(在模板中看不到静态链接?是的)按照常规,应该都显示动态链接,那么静态链接又是如何实现。

在模板文件的footer.htm文件中,有这样一行代码。

复制代码这段代码解析后,直接调用了function_core.php中的output()函数。

我们来看看output函数执行了哪些操作。

if($_G['setting']['rewritestatus'] || !empty($havedomain))

{
$content = ob_get_contents();

$content = output_replace($content);

ob_end_clean();

$_G['gzipcompress'] ? ob_start('ob_gzhandler') : ob_start();

echo $content;

}复制代码程序执行到这里的时候,执行了一个 $content = ob_get_contents();的操作, ob_get_contents()获取当前输出缓存中的所有数据,也就是说,模板返回的页面并没有直接显示给用户,而是被$content变量获取到了。然后进入output_replace函数执行内容替换(各种替换,不仅仅是伪静态链接替换),最后又echo输出。

于是,替换工作就放在output_replace函数中,

if(!empty($_G['setting']['output']['str']['search']))

{
if(empty($_G['setting']['domain']['app']['default'])) {
$_G['setting']['output']['str']['replace'] = str_replace('{CURHOST}', $_G['siteurl'], $_G['setting']['output']['str']['replace']);

}

$content = str_replace($_G['setting']['output']['str']['search'], $_G['setting']['output']['str']['replace'], $content);

}复制代码这一部分,替换的是当前站点的域名,将写在模板中的'{CURHOST}'占位符替换为$_G['siteurl']的值。

if(!empty($_G['setting']['output']['preg']['search']))

{
if(empty($_G['setting']['domain']['app']['default'])) {
$_G['setting']['output']['preg']['search'] = str_replace('\{CURHOST\}', preg_quote($_G['siteurl']), $_G['setting']['output']['preg']['search']);

$_G['setting']['output']['preg']['replace'] = str_replace('{CURHOST}', $_G['siteurl'], $_G['setting']['output']['preg']['replace']);

}

$content = preg_replace($_G['setting']['output']['preg']['search'], $_G['setting']['output']['preg']['replace'], $content);

}复制代码这一个部分则是替换伪静态链接,具体的实现过程,我简单介绍下,没有兴趣的同学可以跳过。

$_G['setting']['output']['preg']['search']数组中保存的数据,类似于

/]*)\>/e

对应的$_G['setting']['output']['preg']['replace']中的一条数据为

rewriteoutput('forum_forumdisplay', 0, '\1', '\3', '\5', '\6')

这里利用了preg_replace函数的一个特性,当匹配模式中带有e修饰符,用eval进行后向引用替换,即替换变量和执行对应函数。也就是说,preg_replace将匹配到的子串,以参数的形式传入rewriteoutput函数,rewriteoutput函数返回的值作为替换的内容。(页面上有几个链接,将会执行几次rewriteoutput函数,这就是开启伪静态略微影响性能的原因)

问题又来了,伪静态不被替换这是为什么呢?

原因很简单,因为是在页面输出之前才做的替换,所以一切程序上做可能做的手脚都是浮云了。真正起作用的仅仅是输出之前的链接,是不是符合伪静态的替换规则呢。类似于/forum.php?mod=viewthread&tid=XX#lastpost这样的链接自然是无法被成功替换的咯

至此,Discuz伪静态是如何替换并显示的机理就算介绍完毕了。

Discuz!伪静态不管在SEO优化方面,还是在用户体验方面都有很大的帮助,让用户更容易记住地址,更有利于内容页的长尾关键词排名,希望上面的分析对大家使用dz建站有帮助。
我要说一句 收起回复

回复

 懒得打字嘛,点击右侧快捷回复【查看最新发布】   【应用商城享更多资源】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

创宇盾启航版免费网站防御网站加速服务
投诉/建议联系

discuzaddons@vip.qq.com

未经授权禁止转载,复制和建立镜像,
如有违反,按照公告处理!!!
  • 联系QQ客服
  • 添加微信客服

联系DZ插件网微信客服|最近更新|Archiver|手机版|小黑屋|DZ插件网! ( 鄂ICP备20010621号-1 )|网站地图 知道创宇云防御

您的IP:3.142.135.24,GMT+8, 2024-12-22 18:27 , Processed in 0.224575 second(s), 76 queries , Gzip On, Redis On.

Powered by Discuz! X5.0 Licensed

© 2001-2024 Discuz! Team.

关灯 在本版发帖
扫一扫添加微信客服
QQ客服返回顶部
快速回复 返回顶部 返回列表