Discuz!伪静态原理剖析

2021-10-02 0 4,464 百度已收录
阿奇源码默认解压密码为"www.aqiyuanma.com",2021年9月11日前的源码默认解压密码为"www.hnymwl.com"
阿奇官方VIP技术群:483386718,阿奇源码技术交流群:938992858!速奇云-香港云服务器38元/月

Discuz全局后台各项设置篇

Discuz全局后台各项设置篇

伪静态在seo火热的时代,是每个站长都对照关注的问题,discuz!论坛若何伪静态,为什么伪静态失效了,为什么列表页无法实现伪静态,为什么有些页面不是伪静态呢?下面dz官方nxy105从两个角度入手为人人剖析下discuz! X2是若何实现伪静态功效。
第一、Discuz!伪静态是若何作用的
我们都知道,当我们通过地址接见一个页面的时刻,接见的是服务器上的一个实体文件。例如,接见
http://www.xxx.com/index.html
复制代码
, 接见的是网站根目录下的index.html文件。然而,对于论坛,若是每一个页面(主题列表,内容页)都是一个静态的实体文件,那文件的数目将何其之 多,而且不能动态的实时的展现论坛的内容。若是仅仅使用动态接见,那么晦气于增强搜索引擎的友好面,因此,我们将使用伪静态,展现形式是.html这样的 静态页面,而现实上依然是通过动态脚原本处置的。
discuz! X2的伪静态处置行使了服务器的rewrite模块,通过rewrite模块的设置的规则,对请求的url举行转换。
下面我们以Apache的rewrite模块为例,详细说明一下。
RewriteRule ^(.*)/forum-(\w+)-([0-9]+)\.html$ $1/forum.php?mod=forumdisplay&fid=$2&page=$3&%1
复制代码
这是一条Apache的伪静态规则
rewrite规则匹配的是/forum-XX-XX.html的url请求,经由规则转换后,现实请求的链接是 /forum.php?mod=forumdisplay&fid=XX&page=XX,是不是很熟悉,这就是请求论坛主题列表的动态 链接啦。
以是问题来了,若是伪静态请求失效/forum-XX-XX.html,提醒页面无法显示,有几种错误的可能性呢?
1、伪静态规则生效了有没有?
若是服务器不支持rewrite,若是忘了重启服务,若是.htaccess文件放置的位置纰谬,等等,都可能导致rewrite功效没有运行,这样一定是不行的哦。以是,先检查下rewrite功效是否正常吧,若是使用空间的话,可以咨询下空间商的说。
2.规则错误了有没有?
若是规则是这样的
RewriteRule ^(.*)/forum-(\w+)-([0-9]+)\.html$ $1/forum.php?mod=forumdisplay
复制代码
少了器械是不是,以是/forum-XX-XX.html只会接见/forum.php?mod=forumdisplay,这样列表页一定不显示了
若是规则更夸张一些
RewriteRule ^(.*)/forum-(\w+)-([0-9]+)\.html$ $1/forumdisplay.php&fid=$2&page=$3&%1
复制代码
forumdisplay.php这个文件都没有,页面固然无法显示,这也就注释了已往版本(如X1.5和7.0)的有些规则无法在X2中直接使用的缘故原由了。
以是规则准确才是页面能够正常接见的条件,若是使用新的规则,

Discuz X3.2/X2.5缩略图添加水印方法

Discuz X3.2/X2.5缩略图添加水印方法

发现无法接见了,首先检查规则有没有写错了。(实在这些在论坛后台伪静态设置的地方都可以查的到,基本不用列位站长费心的嘛)

3、网络正常有没有?
若是拼命在伪静态中找寻缘故原由,没注意站点已经无法正常接见,是不是有种缘木求鱼的感受,站点无法接见的缘故原由请参看官方论坛相关教程。
剖析到这一步,信托人人对于伪静态若何起作用已经有一定的领会了,那么我们转向下一个问题。
第二、伪静态是若何在论坛显示出来的?
为什么我的站伪静态开启了,但在首页照样显示动态链接呀?那么下面解说下,伪静态是若何显示出来的。
领会discuz!的同砚应该知道,在论坛模板文件中,以是的url链接都是以动态的形式返回输出的。(在模板中看不到静态链接?是的)根据通例,应该都显示动态链接,那么静态链接又是若何实现。
在模板文件的footer.htm文件中,有这样一行代码。
<!–{eval output();}–>
复制代码
这段代码剖析后,直接挪用了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’]数组中保留的数据,类似于
/<a href\=”()forum.php\?mod\=forumdisplay&(amp;)?fid\=(\w+)(&page\=(\d+))?”([^\>]*)\>/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伪静态是若何替换并显示的机理就算先容完毕了。
收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

注:在使用本系统时,使用方必须在国家相关法律法规范围内并经过国家相关部门的授权许可,禁止用于一切非法行为。使用用途仅限于测试、实验、研究为目的,禁止用于一切商业运营,本团队不承担使用者在使用过程中的任何违法行为负责。

阿奇源码 DISCUZ教程 Discuz!伪静态原理剖析 https://www.aqiyuanma.com/109731.html

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务

  • 0 +

    访问总数

  • 0 +

    会员总数

  • 0 +

    文章总数

  • 0 +

    今日发布

  • 0 +

    本周发布

  • 0 +

    运行天数

你的前景,远超我们想象