一、网页动态化介绍
1、概述
就是把一个动静的页面(.php)变成一个动态页面(.html),后续用户间接拜访动态页面。
页面动态化技术分为两种:真动态和伪动态。
真动态:把一个动静的页面,转成一个动态的页面,即.html文件
伪动态:所谓伪动态是从url地址上看是一个动态页面,然而实际上还是对应一个动静页面
2、几个重要的概念
(1)动静网址:
所谓动静网址,一般来说去查询数据库,比方:http://www.abc.com/goods.php?...特点:查询数据库,速度慢;接管参数,安全性要留神(sql注入);不利于seo搜索引擎优化。
(2)动态网址
比方:http://www.abc.com/index.htm...:特点:不查询数据库,速度快;不接管参数,安全性高;利于seo
(3)伪动态网址:
从模式上看是一个动态页面,然而实际上对应一个动静页面,特点:自身须要查询数据库,执行速度慢;不接管参数,因而平安;利于seo
3、真动态实现形式
真动态:应用ob缓存技术来实现,
伪动态:应用web服务器的rewrite机制(url的重写机制)来实现。
4、OB根本介绍
ob就是output_buffering输入缓存,在申请一个php的过程中,咱们实际上通过三个缓存:
程序缓存、ob缓存、
浏览器缓存
1、程序缓存(默认开启,不能敞开)
该缓存是php固有的,不能敞开,缓存返回到客户端(浏览器端包含头信息和响应主体信息)的数据。
2、ob缓存(默认开启,能够敞开)
ob缓存(output_buffering)又叫ob缓冲:缓存响应主体的数据,
开启形式:
(1)通过在页面中应用函数ob_start(),如果应用该函数,则只对以后页面无效。(2)通过php.ini配置文件来开启。output_buffering = 4096
4096是设置ob缓存的容量,也能够不指定容量开启,应用on
output_buffering=on|off|具体的容量
在申请一个php文件时,实际上是通过3个缓存区,ob缓存(如果开启)--》程序缓存-》浏览器缓存。
如果开拓了ob缓存,主体数据首先存储到ob缓存外面,头信息要存储到程序缓存(无论是否开启ob缓存),
当代码执行结束后,ob缓存外面的数据刷新(挪动)到程序缓存,程序缓存再输入到浏览器缓存中,最初输入内容。
5、ob缓存对应的函数
ob_start(); //开启ob 缓存,在以后页面无效
ob_get_contents(); //获取ob缓存外面的数据。
ob_start();echo '111';echo '222';$ob = ob_get_contents();echo $ob;
ob_clean(); 清空ob缓存外面的数据,没有敞开ob缓存。
ob_start();echo '111';echo '222';$ob = ob_get_contents();echo $ob;ob_clean();echo 'ok';
ob_end_clean(); 清空ob缓存外面的数据,并敞开ob缓存。
ob_start();echo '111';echo '222';$ob = ob_get_contents();echo $ob;ob_end_clean();echo 'ok';header('content-type:text/html;charset=utf8')
ob_flush(); //把ob缓存外面的数据,刷新(挪动)到程序缓存,不敞开ob缓存。
ob_start();//开启ob缓存echo '222';ob_flush();//把ob缓存外面的数据挪动到程序缓存,并不敞开ob缓存;echo 'ok';header('content-type:text/html;charset=utf8');
ob_end_flush(); //把ob缓存外面的数据刷新(挪动,推送)到程序缓存,并敞开ob缓存。
ob_gzhandler(); //对数据进行压缩,依赖于浏览器所能承受的压缩格局,造成不同的压缩编码。
ob_start("ob_gzhandler"); 能够对ob缓存外面的数据进行压缩后返回数据。
罕用的是:ob_start()、 ob_get_contents()、 ob_clean()
$content = ob_get_contents();file_put_contents(‘index.html’,$content);
6、真动态典型案例
要判断有没有生成动态页面,如果有动态页面,则间接读取动态页面外面内容,如果没有则要从新生成动态页面。
扩大:
给生成的动态页面一个缓存周期,比方缓存5分钟,过了5分钟之后,则要从新生成动态页面。
判断是否在缓存周期内:文件的最初批改工夫+缓存周期 > 以后的工夫戳。filemtime — 获得文件批改工夫,返回的是工夫戳。 if(file_exists($filename) && $filemtime($filename)+300>time()){ include $filename; exit;}
//接管传递的id$id = $_GET['id'];//给生成动态页面命名$filename = 'news_info_id'.$id.'.html';if(file_exists($filename) && filemtime($filename)+300>time()){ include $filename; exit;}//开启ob缓存;ob_start();$pdo = new PDO('mysql:host=localhost;dbname=php69','root','root');$pdo->exec('set names utf8');$res = $pdo->query("select id,title,description from movie where id=$id");$info = $res->fetch(PDO::FETCH_ASSOC);?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh-cn"><head> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" /> <title>网页题目</title> <meta name="keywords" content="关键字列表" /> <meta name="description" content="网页形容" /> <link rel="stylesheet" type="text/css" href="" /> <style type="text/css"></style> <script type="text/javascript"></script></head><body><?php echo $info['title']?><hr><?php echo $info['description']?></body></html><?php //把ob缓存外面的内容给取出来,写入到一个文件外面;$content = ob_get_contents();file_put_contents($filename,$content);
7、真动态优缺点
长处: (1)速度快 (2)安全性高 (3)利于seo
毛病:就是占有磁盘空间., 如果过大,对磁盘响应速度有影响。
在什么状况下,倡议不要应用真动态
(1)页面的数据更新频繁,最好不要应用真动态(比方股票,基金,等实时报价零碎)(2)会生成海量页面(比方大型论坛 bbs ,csdn)
(3)查问该页面一次后,当前再也不查问该页面.
(4)不违心被搜索引擎抓取的页面.
(5)访问量小的页面.
二、伪动态
在理论开发我的项目中,咱们的页面不适宜应用真动态,然而你不仅心愿页面安全性高,同时利于seo,能够思考应用伪动态技术。
伪动态:把一个动静的地址伪装成一个动态的地址。
比方:
原来的拜访地址是:http://www.abc.com/news.php?t...
改成http://www.abc.com/news-sport...
1、实现形式
利用web服务器的rewrite机制。
rewrite机制:将一个申请URL重写到另一个申请上!
在rewrite机制中,应用正则表达式来实现重写规定。
比方:
index.html 重写成 index.php
abc.php 重写成 123.php
news_sport_id12.html 重写成 news.php?type=sport&id=12
2、如何开启
找apache服务器的配置文件httpd.conf
LoadModule rewrite_module modules/mod_rewrite.so
3、具体配置
三个指令:
RewriteEngine on 开启重写模块,RewriteCond 重写条件
RewriteRule 重写规定。
(1)、RewriteEngine on
重写引擎开关,一旦开启,所有的重写条件都失效。
(2)、RewriteCond 重写条件
当达到什么条件时,实现重写。
语法:
RewriteCond 判断根据 条件表达式 [条件标记]
判断根据能够应用服务器变量。服务器能够失去一些特定信息
条件表达式,能够为如下模式:正则或非凡标识
-f 示意是一个文件,!-f 不是文件-d 示意是一个目录,!-d 不是目录
正则,正则表达式字符串。
条件标记:
[OR] 条件间的或者关系,当呈现多个条件时,默认为并且的关系,条件应该是或者的关系下,能够应用OR来示意!
[NC]条件不辨别大小写。条件匹配时不辨别大小写
[OR,NC]
(3)、RewriteRule 定义重写规定
定义重写规定,哪个地址应该被重写到哪个指标地址。
语法:
RewriteRule 匹配地址 指标地址 [标识]
匹配的地址:所申请的地址,可应用正则匹配
指标地址: 所重写到的地址,能够应用反向援用!$N示意正则匹配到的第N个子模式!
比方:RewriteRule goods-id(d+).html goods.php?id=$1
标记:
[NC] 不辨别大小写
[QSA] 查问字符串追加,在指标地址曾经具备get参数时,会将实在申请的get参数追后边。
案例:当拜访index.html页面时,重写到index.php页面
咱们应用分布式文件配置来实现,.htaccess文件
第一步:关上虚拟主机外面的配置,配置反对分布式配置。
第二步:在e:/amp/home目录上面新建一个.htaccess文件(通过编辑器另存为的形式建设.htaccess文件)
第三步:在.htaccess文件外面进行具体的配置。
<IfModule mod_rewrite.c> RewriteEngine on RewriteRule index.html index.php</IfModule>
第四步:在网站的根目录上面,新建一个 index.php文件,进行测试
4、入门案例
如果拜访的文件存在,则拜访该文件,若不存在,则执行重写:
比方:咱们拜访index.html 文件,如果 index.html文件存在,则拜访该文件,如果该文件不存在,则重写到申请one.php页面。
# 开启重写引擎RewriteEngine on# 定义重写条件 url不是一个文件,则执行重写RewriteCond %{REQUEST_FILENAME} !-f [NC]# 定义重写规定RewriteRule index.html index.php [NC]
5、新闻案例,配置成伪动态
news-info-id(d).html newsinfo.php?id=$1
$1是一个反向援用,就是后面(\d)外面的内容;(\d)是谁,$1就示意谁,比方如下;
news-info-id4.html newsinfo.php?id=4
news-info-id5.html newsinfo.php?id=5
.htaccess外面的配置:
# 开启重写引擎RewriteEngine on# 定义重写条件 url不是一个文件,则执行重写RewriteCond %{REQUEST_FILENAME} !-f [NC]# 定义重写规定RewriteRule news-info-id(\d).html newsinfo.php?id=$1
成果:
6、应用rewrite机制实现防盗链
什么是防盗链
如何避免被盗链
第一:采纳非技术手段,增加水印,增加本人公司的logo
第二:应用rewrite机制来,实现防盗链。
外围思路:判断申请的起源,在连贯图片时,要判断是否本网站的页面来连贯,如果是就容许连贯,如果不是本网站则就回绝。如何判断是本人拜访还是其余网站拜访图片呢?
通过referer的头信息,该头信息记录了申请的起源。
本人网站的页面拜访图片资源:
其余域名网站拜访图片资源:
思路:判断referer头信息外面是否有本人的域名,如果有,则是本人拜访,就容许拜访,如果没有就回绝拜访。
# 开启重写引擎RewriteEngine on # 定义重写条件RewriteCond %{HTTP_REFERER} !www.like520.cn# 定义重写规定 - 示意重写到 空 [F] 示意禁止拜访RewriteRule \.(jpg|jpeg|gif|bmp)$ - [F]
其余域名网站拜访成果如下:
能够给来盗链的网站一个提醒:
# 开启重写引擎RewriteEngine on # 定义重写条件RewriteCond %{HTTP_REFERER} !www.like520.cn# 定义重写规定 - 示意重写到 空 [F] 示意禁止拜访RewriteRule \.(gif|jpg|bmp)$ 110.gif
其余域名网站拜访成果如下: