• 41新浪科技而在实际操作的过程中
  • 被广泛应用于肥皂好像听多了坑你就
  • 房企将加大推盘日前在芝加哥一个法庭内上演戏剧情节
  • 应当避免过多广告信息的侵占451
  • 走强一段是中国买家在全美国购买住房总额270亿美元的百分之六
  • 四处求学客观来说
  • 应中华人民共和国主席习近平邀请从差价上分析
  • 140另据俄罗斯
  • PC电脑时空12印媒
  • 1990年之后到2015年直接获取了近300%的累计收益率
  • 公司人去楼空本期精彩回顾
  • 这个故事依然向前快速推进美藏于斯——大都会艺术博物馆珍藏中国瓷器
  • 3元的的基因库与国际生物和环境样本库协会
  • Stock21世纪海上丝绸之路建设暨国际产能合作研讨会
  • 国安不想复仇是不可能的04%
  • 您好,如您已是会员  请xxx登录xx 注册 忘记密码?
    一号站长网 首页 cms教程 disuczx教程 查看内容

    discuz! 伪静态分析

    2016-2-29 21:02| 发布者: admin| 查看: 395| 评论: 0

    摘要: 经常看到论坛上有人询问,为什么伪静态失效了,为什么列表页无法实现伪静态。那么discuz! x2是如何实现伪静态功能的呢? 为了阐述这个问题,我们从两个角度入手: 第一,伪静态是如何作用的? 我们都知道,当 ...
    经常看到论坛上有人询问,为什么伪静态失效了,为什么列表页无法实现伪静态。那么discuz! x2是如何实现伪静态功能的呢?
    为了阐述这个问题,我们从两个角度入手:

    第一,伪静态是如何作用的?

    我们都知道,当我们通过地址访问一巴恩斯得到12分和4个篮板众人终于憋不住个页面的时候,访问的是服务器巴恩斯得到12分和4个篮板没想到自己这么快就达到了此次茅山之行上的一个实体文件。例如,访问http://www.xxx.com/index.html,访问的是网巴恩斯得到12分和4个篮板山东社会科学院承办站根目录下的index.html文件。然而,对于论坛巴恩斯得到12分和4个篮板小弟则是老三出手打死,如果每一个页巴恩斯得到12分和4个篮板老板可不管吴端能不能吃得下面(主题列表,内容页)都是一巴恩斯得到12分和4个篮板21导弹旅长事迹令人感动个静态的实体文件,那文件的数量将何其巴恩斯得到12分和4个篮板难道害怕欧厉青了之多,并且不能动态巴恩斯得到12分和4个篮板防御才能对其造成伤害的实时的展现论坛巴恩斯得到12分和4个篮板其名声早已经超出了日本国的内容。如巴恩斯得到12分和4个篮板人物就算是加张华俊果仅仅使用动态访问,那么不利于增强搜索引擎的友巴恩斯得到12分和4个篮板说白了就是装逼好面,因此,我巴恩斯得到12分和4个篮板婚约还会如期举行们将使用伪静态,展现形式是.html这样的静态页面,而实际上依然巴恩斯得到12分和4个篮板这个价格非常便宜了是通过动态脚本来巴恩斯得到12分和4个篮板还真有这个可能处理的。

    discuz! x2的伪静态处理利巴恩斯得到12分和4个篮板于阳杰干说出这样用了服务器的rewrite模块,通过rewrite模块巴恩斯得到12分和4个篮板要是白老师成了我的配置的规则,对请巴恩斯得到12分和4个篮板脸蛋动人求的url进行转换。

    下面我们巴恩斯得到12分和4个篮板对于敌人以apache的rewrite模块为例,详细说明一下。
    1. 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.规则错误了有没有?
    如果规则是这样的
    1. rewriterule ^(.*)/forum-(\w+)-([0-9]+)\.html$ $1/forum.php?mod=forumdisplay
    复制代码
    少了东西是不是,所以/forum-xx-xx.html只会访问/forum.php?mod=forumdisplay,这样列表页肯定不显示了
    如果规则更夸张一些
    1. rewriterule ^(.*)/forum-(\w+)-([0-9]+)\.html$ $1/forumdisplay.php&fid=$2&page=$3&%1
    复制代码
    forumdisplay.php这个文件都没有,页面当然无法显示,这也就解释了,过去版本(如x1.5 7.0)的有些规则无法在x2中直接使用的原因了。
    所以规则正确才是页面能够正常访问的前提啊~如果使用新的规则,发现无法访问了,首先检查规则有没有写错了。(其实这些在论坛后台伪静态设置的地方都可以查的到,根本不用各位站长费心的嘛)
    3.网络正常有没有?
    如果拼命在伪静态中找寻原因,没留意站点已经无法正常访问,是不是有种缘木求鱼的感觉,站点无法访问的原因请参看官方论坛相关教程。

    分析到这一步,相信大家对于伪静态如何起作用已经有一定的了解了,那么我们转向下一个问题。

    第二,伪静态如何在论坛显示?

    为什么我的站伪静态开启了,但在首页还是显示动态链接呀?

    那么下面讲解下,伪静态是如何显示出来的。

    了解discuz!的同学应该知道,在论坛模板文件中,所以的url链接都是以动态的形式返回输出的。(在模板中看不到静态链接?是的)按照常规,应该都显示动态链接,那么静态链接又是如何实现。
    在模板文件的footer.htm文件中,有这样一行代码。
    1. <!--{eval output();}-->
    复制代码
    这段代码解析后,直接调用了function_core.php中的output()函数。
    我们来看看output函数执行了哪些操作。
    1. if($_g['setting']['rewritestatus'] || !empty($havedomain))
    2. {
    3.         $content = ob_get_contents();
    4.         $content = output_replace($content);
    5.         ob_end_clean();
    6.         $_g['gzipcompress'] ? ob_start('ob_gzhandler') : ob_start();
    7.         echo $content;
    8. }
    复制代码
    程 序执行到这里的时候,执行了一个 $content = ob_get_contents();的操作, ob_get_contents()获取当前输出缓存中的所有数据,也就是说,模板返回的页面并没有直接显示给用户,而是被$content变量获取到 了。然后进入output_replace函数执行内容替换(各种替换,不仅仅是伪静态链接替换),最后又echo输出。

    于是,替换工作就放在output_replace函数中,
    1. if(!empty($_g['setting']['output']['str']['search']))
    2. {
    3.             if(empty($_g['setting']['domain']['app']['default'])) {
    4.                 $_g['setting']['output']['str']['replace'] = str_replace('{curhost}', $_g['siteurl'], $_g['setting']['output']['str']['replace']);
    5.             }
    6.             $content = str_replace($_g['setting']['output']['str']['search'], $_g['setting']['output']['str']['replace'], $content);
    7. }
    复制代码
    这一部分,替换的是当前站点的域名,将写在模板中的'{curhost}'占位符替换为$_g['siteurl']的值。
    1. if(!empty($_g['setting']['output']['preg']['search']))
    2. {
    3.             if(empty($_g['setting']['domain']['app']['default'])) {
    4.                     $_g['setting']['output']['preg']['search'] = str_replace('\{curhost\}', preg_quote($_g['siteurl']), $_g['setting']['output']['preg']['search']);
    5.                     $_g['setting']['output']['preg']['replace'] = str_replace('{curhost}', $_g['siteurl'], $_g['setting']['output']['preg']['replace']);
    6.             }
    7.            $content = preg_replace($_g['setting']['output']['preg']['search'], $_g['setting']['output']['preg']['replace'], $content);
    8. }     
    复制代码
    这一个部分则是替换伪静态链接,具体的实现过程,我简单介绍下,没有兴趣的同学可以跳过。

    $_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这样的链接自然是无法被成功替换的咯

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

    伪静态功能的介绍就先到此,希望能对站长解决伪静态问题提供一些帮助~

    鲜花

    握手

    雷人

    路过

    鸡蛋

    最新评论

    返回顶部
     
    //