一、网页动态化介绍

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

其余域名网站拜访成果如下: