伪静态在seo火热的时代,是每个站长都比较关注的问题,discuz!论坛如何伪静态,为什么伪静态失效了,为什么列表页无法实现伪静态,为什么有些页面不是伪静态呢?下面dz官方nxy105从两个角度入手为大家分析下discuz! X2是如何实现伪静态功能。

第一、Discuz!伪静态是如何作用的

我们都知道,当我们通过地址访问一个页面的时候,访问的是服务器上的一个实体文件。例如,访问

  1. http://www.xxx.com/index.html

复制代码

,访问的是网站根目录下的index.html文件。然而,对于论坛,如果每一个页面(主题列表,内容页)都是一个静态的实体文件,那文件的数量将何其之多,并且不能动态的实时的展现论坛的内容。如果仅仅使用动态访问,那么不利于增强搜索引擎的友好面,因此,我们将使用伪静态,展现形式是.html这样的静态页面,而实际上依然是通过动态脚本来处理的。

discuz! X2的伪静态处理利用了服务器的rewrite模块,通过rewrite模块的配置的规则,对请求的url进行转换。

下面我们以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这样的链接自然是无法被成功替换的咯

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

这几天觉得,discuz伪静态很好研究,又发现自己论坛的导读功能要贴伪静态,如是乎,就出了这个教程贴.....

/forum.php?mod=guide&view=digest  这样的地址真的不好看,然后discuz至少是x2.5还没有给导读加伪静态规则,x3.0我就不知道了,没仔细去看

欢迎访问 http://www.sxwlkj.net 上线网络科技提供

接下来进入正题.....

1.function_admincp.php  // 添加后台界面出现  1384行

$data['rulesearch']['forum_guide'] = 'guide-{action}-{page}.html';
$data['rulereplace']['forum_guide'] = 'portal.php?mod=guide&view={action}&page={page}';
$data['rulevars']['forum_guide']['{action}'] = '([a-z0-9_\-]+)';
$data['rulevars']['forum_guide']['{page}'] = '([0-9]+)';

2.function_admincp.php 替换url地址规则 1340行

if(in_array('forum_guide', $_G['setting']['rewritestatus'])) {
     $data['search']['forum_guide'] = "/".$_G['domain']['pregxprw']['forum']."\?mod\=guide&(amp;)?view\=(\w+)(&page\=(\d+))?\"([^\>]*)\>/e";
     $data['replace']['forum_guide'] = "rewriteoutput('forum_guide', 0, '\\1', '\\3', '\\5', '\\6')";
}//自己添加的导读导航

3.替换函数加个导读判断 function_core.php

function rewriteoutput($type, $returntype, $host)

} elseif($type == 'forum_guide') { // 添加的
                list(,,, $action, $page, $extra) = func_get_args();
                $r = array(
                        '{action}' => $action,
                        '{page}' => $page ? $page : 1,
);//添加的

4.添加语言  lang_admincp.php  //添加

最后结果如下面截图  后台

<ignore_js_op>

最后结果如下面截图  前台

<ignore_js_op>

QQ截图20130609171641.jpg (51.15 KB, 下载次数: 5)

Discuz!伪静态原理分析的更多相关文章

  1. Handler系列之原理分析

    上一节我们讲解了Handler的基本使用方法,也是平时大家用到的最多的使用方式.那么本节让我们来学习一下Handler的工作原理吧!!! 我们知道Android中我们只能在ui线程(主线程)更新ui信 ...

  2. Java NIO使用及原理分析(1-4)(转)

    转载的原文章也找不到!从以下博客中找到http://blog.csdn.net/wuxianglong/article/details/6604817 转载自:李会军•宁静致远 最近由于工作关系要做一 ...

  3. 原子类java.util.concurrent.atomic.*原理分析

    原子类java.util.concurrent.atomic.*原理分析 在并发编程下,原子操作类的应用可以说是无处不在的.为解决线程安全的读写提供了很大的便利. 原子类保证原子的两个关键的点就是:可 ...

  4. Android中Input型输入设备驱动原理分析(一)

    转自:http://blog.csdn.net/eilianlau/article/details/6969361 话说Android中Event输入设备驱动原理分析还不如说Linux输入子系统呢,反 ...

  5. 转载:AbstractQueuedSynchronizer的介绍和原理分析

    简介 提供了一个基于FIFO队列,可以用于构建锁或者其他相关同步装置的基础框架.该同步器(以下简称同步器)利用了一个int来表示状态,期望它能够成为实现大部分同步需求的基础.使用的方法是继承,子类通过 ...

  6. Camel运行原理分析

    Camel运行原理分析 以一个简单的例子说明一下camel的运行原理,例子本身很简单,目的就是将一个目录下的文件搬运到另一个文件夹,处理器只是将文件(限于文本文件)的内容打印到控制台,首先代码如下: ...

  7. NOR Flash擦写和原理分析

    NOR Flash擦写和原理分析 1. NOR FLASH 的简单介绍 NOR FLASH 是很常见的一种存储芯片,数据掉电不会丢失.NOR FLASH支持Execute On Chip,即程序可以直 ...

  8. 使用AsyncTask异步更新UI界面及原理分析

    概述: AsyncTask是在Android SDK 1.5之后推出的一个方便编写后台线程与UI线程交互的辅助类.AsyncTask的内部实现是一个线程池,所有提交的异步任务都会在这个线程池中的工作线 ...

  9. (转)Android 系统 root 破解原理分析

    现在Android系统的root破解基本上成为大家的必备技能!网上也有很多中一键破解的软件,使root破解越来越容易.但是你思考过root破解的 原理吗?root破解的本质是什么呢?难道是利用了Lin ...

随机推荐

  1. Android基础新手教程——4.3.1 BroadcastReceiver牛刀小试

    Android基础新手教程--4.3.1 BroadcastReceiver牛刀小试 标签(空格分隔): Android基础新手教程 本节引言 本节我们将来学习Android四大组件中的第三个:Bro ...

  2. Objective-C语言的 if ( self = [super init] )

    我们先假设如今自己创建了个类.我们起名叫MyObject,继承于NSObject. 继承知道吧,就是你这个子类(MyObject)假设什么都不写的话,和父类(NSObject)就是一模一样的. OC里 ...

  3. libsqlite3.dylib与libsqlite3.0.dylib的差别

    在我们加入数据库框架时,在搜索框中输入sqlitekeyword,以下列表区会显示libsqlite3.dylib,libsqlite3.0.dylib. 此时我们选择libsqlite3.0.dyl ...

  4. Applications using Launch Screen Files and targetting iOS 7.1 and earlier need to also include a Launch Image in an Asset Catalog.

    在使用xcode6建的项目时,有时在ios7模拟器下会出现一下情况 导航栏上方和tabbar下方会有黑边 并且会有一下警告: Applications using Launch Screen File ...

  5. 蓝书2.2 KMP算法

    T1 Radio Transmission bzoj 1355 题目大意: 一个字符串,它是由某个字符串不断自我连接形成的 但是这个字符串是不确定的,现在只想知道它的最短长度是多少 思路: kmp 输 ...

  6. [转]使用git进行版本控制

    使用git进行版本控制 本文将介绍一种强大的版本控制工具,git的基本使用.与之前svn工具类似,首先给出一些常见的使用需求,然后以这些需求为中心,来展开git的学习过程.由于我也是在学习当中所以其中 ...

  7. request.getRemoteAddr()和request.getRemoteHost()

    转自:https://www.cnblogs.com/aizj/p/7593209.html request.getRemoteAddr()是获得客户端的ip地址.request.getRemoteH ...

  8. java笔记线程方式1优先级

    * 我们的线程没有设置优先级,肯定有默认优先级. * 那么,默认优先级是多少呢? * 如何获取线程对象的优先级? *   public final int getPriority():返回线程对象的优 ...

  9. 微信H5页面 - 调酒

    这是微信H5的一款小游戏(一款酒的推广活动),主要游戏页面如下: 游戏规则: 点击选择2个元素(圈圈图片),放入瓶中,使它们与瓶中已有的三个元素碰撞,调配佳酿. 只有选择正确的2个元素搭配,才可以调配 ...

  10. [Swift]经典解题思路:联合查找Union Find

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...