一、网页动态化介绍
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
其余域名网站拜访成果如下: