随着SEO 的普及,静态化便成为网站开发的必要技术之一。网页设计 时,网站静态化通常有三种方法可以实现,一种是伪静态,一种是实实在在的静态页面,最后一种是pathinfo技术。
伪静态 下, 如果是apache服务器,是通过.htaccess文件来操作。如果是IIS服务器,则是通过httpd.ini和rewrite.dll来实现。伪静 态处理的关键技术是配置文件的规则如何得到有效的控制,并在html页面里对应起来,一旦规则改变,则html页面里的链接也需要根据规则动态的改变。后 台设置规则,并且写入.htaccess文件,同时根据规则生成php语言的规则,那么在php程序里根据规则显示页面的不同内容。这种方式的难点在于对 htaccess文件的彻透理解和应用以及php正则表达式的灵活运用上。
通过这种方式转化的静态页面的路径有两种表现形式,一种是非常规则的,比如一篇文章,article.php?artid=12,则转化成静态页面可能就 是这样:article-do-view-artid-12.html。因为每个页面必须要有动作和对象,这样便于统一管理,也可以表示成这种形 式:article/do/view/artid/12.html等等。这种形式只要在htaccess文件中写一句话便可以控制全局,那就是Rewrite Rule ^([^-]*)-(.*)$ $1.php?$2 。这样,整个规则就只有一个规则,程序里要做的只有对$2号的字符串进行处理,相对简单。第二中形式就相对人性化点,美观点,我们要把连接形式转化为article/12.html 或者 article/hello-world.html 更或者 article/hello-world_page2.html ,这种方式要对每个连接都作处理,如果只给出这种规则,计算机是不能理解的,除非给成 article/(.*)(_page[0-9])\.html 这种规则,那么在处理上就有相当大的难度,因为要把rewrite的规则解析为php的正则并进行替换,还有这些规则必须由熟悉rewrite和php的程序员来写,不利于推广。
静态页面,只要把目录地址保存在数据库里调用,但是有些动态的信息,比如登录信息,文章点击数等需要做动态的改变,这种情况主要通过js和重新生成静态页面来显示.
这里给出两种生成静态页面的方法:
一、通过ob函数来控制浏览器输出。
ob_start(); include template('index'); $data = ob_get_contents(); ob_clean(); file_put_contents($filename, $data);
二、通过预先得知这个页面的地址来通过网页抓取。
function create_html($filepath, $phpfile, $page = 1){ global $siteurl; $filepath = ROOT.$filepath; $htmlpath = substr($filepath,0,strrpos($filepath,"/")); if(!is_dir($htmlpath))makeDirs($htmlpath); $contents = dfile_get_contents($siteurl.$phpfile); dfile_put_contents($filepath, $contents); }
伪静态的优点主要在于灵活,相对于静态文件就是不需要额外的脚本来生成或控制静态页面的内容,不占用服务器空间。由于是服务器内部解析的地址,所以内容是实时更新的,也不存在文件管理和硬件问题,维护比较方便。在服务器级URL Rewrite 重写技术并不影响页面的执行速度。但是URL Rewrite 的门槛比较高,国内虚拟主机大多不支持,而且虚拟主机是目录级的url Rewrite ,通过遍历目录读物URL转发规则的方式将大大降低页面的执行速度。
静态页面的好处在于少了动态解析过程,提高了页面的访问速度和稳定性,使得优化效果非常明显。对数据库和服务器的软件资源耗费少。但是占用了服务器的硬件资源,对于大型网站而言,这种方法将带来不可忽视的后继问题: 由于生成的文件数量较多,存储需要考虑文件、文件夹的数量问题和磁盘空间容量的问题,需要大量的服务器设备;程序将频繁地读写站点中较大区域内容,考虑磁 盘损伤问题及其带来的事故防范与恢复,硬件损耗要更新、站点备份要到位;页面维护的复杂性和大工作量,及带来的页面维护及时性问题,需要一整套站点更新制 度和专业的站点维护人员;
对于第三种方式,php业界流行的框架比如zend,thinkphp就应用的比较多,归根结底,他们在某些条件下也缺少不了.htaccess这个文 件,因为他们的目的都是想要把所有的连接(除过图片,js,css)都指向index.php这个文件。这里用到的主要技术之一便是pathinfo,关 于pathinfo的原理,这里就不再做过多讨论了。这种技术和用.htaccess技术的区别就在于没有使用.htaccess文件,好像说的是废话, 不过还是需要注意的。
所以综合上诉原因,个人认为:
对于一般企业网站,个人网站,这些网站信息在网页设计 时,一旦发布就很少更改,网站信息量不多的情况下,而且一般使用的是虚拟主机,可以选择生成静态页的方式。
对于大型网站,信息量巨大,具有独立服务器,可采用URL Rewrite 的方式。
对于一些中型网站,使用虚拟主机的就采用生成静态页的方式,有条件购置服务器的可视具体网站类型而定,若网站交互性较强,局部更新内容比较多的话,可以采用Rewrite ,若页面内容比较固定的话,使用静态页生成技术效果就更佳。
伪静态是相对真实静态来讲的.通常我们为了更好的缓解服务器压力 ,和增强搜索引擎的友好面.都将文章内容生成静态页面.但有时为了实时的显示一些信息.或者还想运用动态脚本解决一些问题.不能用静态的方式来展示网站内容.可这就损失了对搜索引擎的友好.怎么样在两者之间找个中间方法呢,这就产生了伪静态技术.
下面是生成伪静态地址和逆转伪静态地址的两个函数,这两个函数在相应的位置引用就可以实现将http://www.zhongya.cn/certificate_page.php?clid=22
转成这样的http://www.zhongya.cn/certificate_page.php/clid_22.htm形式。
/****************************** 使用参考: 将此http://www.zhongya.cn/company/companyshow.php?action=list&page=2 地址生成http://www.zhongya.cn/company/companyshow.php/action_list/page_2.htm形式 $url="http://www.zhongya.cn/company/companyshow.php?action=list&page=2"; $urlStr=MakeUrlHtml($url); echo $urlStr; *****************************/ function MakeUrlHtml($url){ $durl=parse_url($url); $urlStr=""; if($durl['host']) $urlStr.=$durl['scheme']."://".$durl['host']; if($durl['path']) $urlStr.=$durl['path']; if($durl["query"]){ $durl=explode("&",$durl["query"]); foreach($durl as $surl){ $gurl=explode("=",$surl); $eurl[]=$gurl[0]."_".$gurl[1]; } $tmpurl=join("/",$eurl).".htm"; $urlStr.="/".$tmpurl; } return $urlStr; } /****************************** 描 述:完成将伪静态地址还原成$_GET形式 使用参考: 将此http://www.zhongya.cn/company/companyshow.php/action_list/page_2.htm地址 还原出$_GET["action"]=list/$_GET["page"]=2 ParseUrl(); *****************************/ function ParseUrl(){ if($_SERVER['PATH_INFO']!=""){ $pathinfo=substr($_SERVER['PATH_INFO'],1); $pathinfo=str_replace(".htm","",$pathinfo); $tmp=explode("/",$pathinfo); foreach($tmp as $val){ $path=explode("_",$val); $count=count($path); for($i=0;$i<$count;$i+=2){ $_GET[$path[$i]]=$path[$i+1]; } } } }