关于php:页面静态化

34次阅读

共计 5632 个字符,预计需要花费 15 分钟才能阅读完成。

一、网页动态化介绍

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

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

正文完
 0