页面静态化详解
一、明确几个重要概念
静态网址:纯静态HTML文档
动态网址:内容存于数据库中,根据要求显示内容,URL中以 ?, & 显示不同的参数,如:news.php?lang=cn&class=1&id=2
伪静态网址:伪静态仅仅是对动态网址的一个重写,伪静态网址不能让动态网址“静态化” ,搜索引擎不会认为伪静态就是HTML文档。其次,伪静态可取,但应把重心放在去除冗余参数、规范URL、尽可能的避免重复页上。
举例说明: 这是一个动态网址 news.php?lang=cn&class=1&id=2,从seo的角度来看, 最好重写为 news-cn-sport-id2.html。这样的也更加有效的防止sql注入攻击 ☞ 但是也不要精简重写为 news-2.html,这样简写同样不利于搜索引擎优化.
二、页面静态化概念
■ 页面静态化概念
我们大多数情况下是直接访问php文件,php脚本在服务器端执行并 返回信息,对于一些大型的网站,访问量很大,频繁的动态操作和操作 数据库会加重服务器的负担.
在实际开发中,通常使用缓存技术(memcached)或者页面静态化 来解决
从静态化形式看,页面静态化分为:
① 真静态
② 伪静态
从静态范围看,页面静态化分为:
① 整个页面静态化
② 局部静态化(jquery)
页面静态化的必要性1
我们看一个实际问题? 使用apache提供的 benchmarking tool来测试 下面的两个程序,看看访问各种访问的时间是怎样的?
//直接使用html输出for循环的 信息. 01......99
for($i=0;$i<100;$i++){ echo "$i"; }
apache/bin/ab.exe 程序可以来做效率测试
基本使用: ab [options] [http[s]://]hostname[:port]/path
options是选项: -n 执行访问次数 -c 用户并发数量
页面静态化的必要性2
从seo的角度来,google,baidu 更偏好静态网址(伪静态网址),比 如: news.php?lang=cn&class=1&id=2 这样的动态网址,不如 news-cn-sport-id2.html ,这样的格式.
页面静态化的必要性3
从安全的角度来看news-cn-sport-id2.html 更不容易被sql注入攻 击。
三、使用php缓存机制完成页面静态化
我们可以使用php自带的缓存机制来完成页面静态化,但在这里我要 说明一点,仅靠php自身的缓存机制并不能完美的解决页面静态化, 往往需要和其它静态化技术(通常是伪静态技术)结合使用,
例子:(新闻查询系统)当访问一个页面时,先判断是否存在缓存,如果存在,则直接输出缓存文件中的内容。否则,则先查询数据库,获得数据,然后生成缓存文件。 详解PHP的缓存机制(图), Output_buffering ,常用的函数包括 ob_start() ob_get_contents() ,ob_clean(),ob_end_clean() ob_end_flush() ob_flush() flush()
关于PHP经常有面试题.简述ob_flush() 和flush()的 区别? 简述PHP缓存机制.
单纯使用php缓存机制完成页面静态的不足分析
解决方案(真静态和伪静态技术.)
四、页面静态化(真静态)--原理示意图
简单的说: 页面静态化技术就是要把php->html直接访问,从 而减少对数据库的操作,达到提高访问速度
基本流程是:
1.创建模板文件template.html
2.通过模板文件,创建静态页面的 php文件 xx.php
3. 用户访问生成的静态页面 xx.html
快速入门案例(根据模板生成静态页面)
五、数据库和页面静态化(真静态)结合
使用静态页面技术如何处理,在添加新闻的时候完成两件事情:
①添加数据到数据库
②同时生成对应的新闻详细信息显示静态页面
六、页面静态化(真静态)的优点和缺点
html静态页(真静态)的好处有三点;
一是减少服务器对数据响应的负荷,
二是加载不用调动数据库,响应速度快。
三是便于优化引擎。缺点也有几点:一是空间占用比较大。二是生成的文件多了,服务器对html文件的响应负担也较重。
如果一个系统使用真静态进行页面静态化,需要生成海量的静态 页面,我们可以考虑使用伪静态来处理.
七、伪静态 1
比如这个网页 http://localhost/content.php/1,122,8912.html其实处理的脚本是content.php 参数为1,122,8912 相当于content.php?a=1&b=122&c=8912 只不过这样的URL太难记。搜索引擎也不喜欢。
真静态只是完全生成了HTML。 客户端访问的时候直接输出。不用脚本解释。在流量非常大的时候(比如每天有上百万的访问量的时候)会起到很好的效果。也就是说服务器端实实在在的存在这个HTML页面。 当然在你网站的流量没有那么大的时候。URL重写是最好的方法(如果访问量很大,还可以考虑负载均衡)
URL重写的方法有很多种,APACHE(rewrite),IISREWRITE。PHP脚本直接处理。我们先讲解如何使用PHP脚本直接处理。
八、伪静态 2
下面以程序为例讲一下PHP伪静态的程序实现方法程序为例:
http://localhost/content.php/1,122,8912.html
//利用server变量 取得PATH_INFO信息 该例中为 /1,122,8912.html 也就是执行脚本名后面的部分
if(@$path_info =$_SERVER["PATH_INFO"]){
//正则匹配一下参数
if(preg_match("/\/(\d+),(\d+),(\d+)\.html/si",$path_info,$arr_path)){
$gid =intval($arr_path[1]);
//取得值 1
$sid =intval($arr_path[2]);
//取得值122
$softid =intval($arr_path[3]);
//取得值8912
}else die("Path:Error!");
}else die('Path:Nothing!');
面试题: 匹配模式中的 s表示什么意思.
九、伪静态 3
下面以程序为例讲一下另外一种形式的PHP伪静态的程序实现方法程序为例:
http://www.hsp.com/news-id23.html 实现上面形式的伪静态使用另外一种方式,通过apache的 rewrite机制来实现.
十、伪静态4
下面以程序为例讲一下另外一种形式的PHP伪静态的程序实现方法程序为例:
http://www.hsp.com/news-id23.html 我们使用另外一种方式,通过apache的 rewrite机制来实现.
1.检测Apache是否支持mod_rewrite 通过php提供的phpinfo()函数查看环境配置,通过Ctrl+F查找到“Loaded Modules”,其中列出了所有 apache2handler已经开启的模块,如果里面包括“mod_rewrite”,则已经支持,不再需要继续设置。
如果没有开启“mod_rewrite”,则打开目录 您的apache安装目录“/apache/conf/” 下的 httpd.conf 文 件,通过Ctrl+F查找到“LoadModule rewrite_module”,将前面的”#”号删除即可。
如果没有查找到,则到“LoadModule” 区域,在最后一行加入“LoadModule rewrite_module modules/mod_rewrite.so”(必选独占一行),然后重启apache服务器即可。
十一、伪静态5
2.在httpd.conf中配置虚拟主机
# Virtual hosts
启用虚拟主机 Include conf/extra/httpd-vhosts.conf
3.httpd_vhosts.conf文件中,配置相应的选项.详细讲解
<VirtualHost *:80> DocumentRoot "C:/myenv2/apache/htdocs/static2" ServerName www.hsp.com <Directory "C:/myenv2/apache/htdocs/static2"> #403错误提示,可以阻止人访问. #Allow from All #如果文件目录在apache目录外面,注释掉optinos 则,不能列表. #options +Indexes #不让列出列表配置 #options None #设置欢迎页面 #DirectoryIndex aa.html #下面这个表示可以去读取 .htaccess文件,也可以直接在虚拟主机中配置. #Allowoverride All RewriteEngine On RewriteRule news-id(\d+).html$ searchNews.php?id=$1 #如果匹配不到,可以指定一个错误页 errorDocument 404 /404.php #这里可以设置多个重写的规则 #RewriteRule news-id.html$ error.php </Directory> </VirtualHost>
十二、伪静态 6
4.在相应的目录下编写.htaccess 重写规则
如果在linux下可以直接创建, 如果是在windows平台下,用记事本创建一个文件,比如abc.txt,然后另存 为 .htaccess文件即可
5.重写规则,也可以直接在配置虚拟主机的<Directory>段配置.
十三、伪静态 7
☞ rewrite规则介绍
我们新建一个.htaccess文件之后,就在里面写入以下内容: RewriteEngine on #rewriteengine为重写引擎开关on为开启off为关闭
快速入门案例: RewriteRule ([0-9]{1,})$ index.php?id=$1 我讲解一下RewriteRule:RewriteRule是重写规则,支持正则表达式的,上面的 ([0-9]{1,})是指由数字组成的,$是结束标志,说明是以数字结束!
现在我们可以实现伪静态页面了,(上机练习题!)
我们希望把用户输入的 http://localhost/view-23.html ulr
重新被apache替换成 http://localhost/index.php?action=view&id=23 这个规则应当怎样写?
☞ 在.htaccess目录下创建一个index.php看看能否得到apache改写后的url $_GET['action'] => view $_GET['id'] => 23
十四、伪静态特点
如果一个网站使用真静态技术,会生成海 量的html静态页面,可以考虑使用伪静态 技术来优化我们的网站
url重写(伪静态)的好处:
一,可以方便的实现对化化引擎的优化,并且比生成静态更加方便。
二、占空间比较小。
三、首页每天都自动变化,不用维护。网站首页一般都有热点排行之类的,你可以设为,24小时排行,一周排行,再加上最新文章,最新点评等。这样首页天天是有变化的。
四,便于广告的轮显。比如:你可以把art1234.php,这个虚成n个页,如art_1234.html,news_1234.html,top_1234.html,在不同的页面放不同的广告.总之是动态的,你就可以随意动。
url重写的缺点:就是效率不如生成html的,因为它不是真正意义上的静态页,每次请求是要读取数据库的。但你可以用缓存技术来补偿一下。
十五、真静态 VS 伪静态
①真静态访问效率高,利于seo.可以减少对数据库的操作。但是会占用大量 的磁盘.
②伪静态
一、可以方便的实现对搜索引擎的优化,
二、占空间比较小。
三、通过生成不同view-id2.hmtl 可以实现内容的变化.
四、有效的防止了注入攻击
小结: 如果一个网页会被频繁的访问(比如百万级别),通过该网页每次都会去操作数据库,可以考虑使用真静态(建议有针对性的使用),如果一个网页为了实现对搜索引擎的优化,提供网站的安全性,使用伪静态.
十六、真静态和伪静态的选择
使用静态化技术的建议.
1.网站实时性要求高,不要使用静态化(真静态,伪静态均不适宜).
2.如果网站访问量较小,没有必要使用静态化技术
3.如果数据项目不多,但是访问频率极大,建议使用真静态,比如新浪新闻频道
4.如果数据项目海量,使用真静态会生成海量的html静态页面,建议 使用伪静态
5.在一个大型网站中,静态化技术是综合使用的,这个需要大家经验 的积累,多做项目