***********************************************大型网站提速关键技术(页面静态化,mmecached,mysql优化)***********************************************************************************
************************************************************页面静态化********************************************************************************
1:大型网站关键技术介绍
1)pv值(page views页面一天的浏览量)访问量大
带来的问题:a,流量大 10000000*2m--->解决方案:买带宽、优化程序(处理图片)
b,并发量,同时访问网站的人变多了,解决方案:要对程序的架构 重新设计--->服务器集群。
负载均衡:
硬件实现:F5 BIG-IP NetScalar优点是效果好,缺点是钱。
软件实现:LVS(linux virtual server),nginx(反向代理,轮询技术,top指令可以实时地查看负载)
不仅可以实现多个apache服务器,还可以有多个mysql[数据库负载均衡读写分离amoebal](主master数据库,从slave数据库)
sql语句:
1.select
2.dml(数据操作语句update/insert/delete)
3.ddl(create drop)
4.dcl(数据控制语句grant revoke)
5.dtl(数据事物语句savepoint rollback commit)
2)数据量大--->10亿记录
a,表的设计要合理 b,分表技术(垂直分割,水平分割) c,建立索引 d,读写分离 e,mysql配置优化(调整最大并发量,定时地对数据库碎片整理,备份,crontab) f,硬件升级
c,页面静态化
d,memcached缓存技术
****************************************页面静态化********************************************************
问题:因为sohu首页面的内容相对稳定,没有必要让每一个用户都去查询数据库。
原则:尽量少去查询操作数据库。
看几个概念,然后写代码
静态网址:比如http://localhost/abc.html 即,如果我们访问的是静态页面,我们将这个url成为静态网址。
特点:1,利用seo(search engine optimization)搜索引擎优化 2,访问速度快(不操作数据库) 3,防止了sql注入(http://localhost/index.php?u=***&cp=/*11228*/)
如果我们写程序logincheck.php
<?php
$id=$_GET['get'];
$pwd=$_GET['pwd'];
$sql="select id,pwd from users where id=$id And pwd=$pwd ";
$res=Mysql_query($sql);
//根据res来判断是否存在该用户,然后登陆成功!
修改后为:
$sql="select pwd from users where id=$id ";
$res=Mysql_query($sql)
if($pwd===从数据库中取出的密码){
//说明该用户存在
}else{
//说明用户密码错误!
}
?>
动态网址:比如http://localhost/news.php?id=112,即,访问的是一个Php页面,可以传入参数,称为动态网址。
特点:1,不利于seo 2,访问速度慢 3,有被注入sql可能。
伪静态网址:在实际开发中,我们程序员希望达到这样的目的 :将类似于http://localhost/news.php?lang=cn&class=sport&id=2的网址,修改成如下网址。
http://localhost/news-cn-sport-id2.html 这种网址我们称为伪静态网址
特点:1,利于seo 2,防止注入 3,它任然要访问数据库,速度没有变化
页面静态化技术的分类:
从方式来看:1)真静态 2)伪静态
从范围来看:1)全局 2)局部静态化(依赖于ajax+jquery)(开发中用得最多)
介绍一款测试眼里的工具:apache自带的!!!!!!!!!!!!1apache调优**************************************
apache/bin/ab.exe程序可以测试效率。大家在工作中可以使用该工具来测试自己的网站并发量大小与某一个页面访问时间。
ab.exe工具的基本用法,进入到cmd控制台
ab.exe -n 访问的总次数 -c 并发量(瞬间模拟多少人请求) 访问页面的url
举例说明:
ab.exe -n 10000 -c 100 http://localhost/test.php
当我们将-c调整到1000时,我们发现apache瘫痪了。给大家说一下如何调整apache的最大并发量?
MPM(多路处理模块,即,apache采用怎么样的方式处理并发):主要有三种方式 1)perfork预处理进程方式 2)worker 工作模式 3)winnt 这个一般说是windows采用的
如何设置我们的apache最大并发数
1)在http.conf中修改,寻找mpm,去掉Include conf/extre/httpd-mpm.conf前的#
2)确定当前apache使用什么mpm模式
进入到apache/bin,输入httpd.exe -l
说明:看mpm_XXXC 如果是winnt 说明是winnt 另外还可能是pefork或者worker
3)修改hhtpd-mpm.conf 文件
调大相应的模式下的ThreadsPerChild 后的数。
4)重启apache,测试。
因为在Linux下,一般采用perfork模式居多,我们看看如何配置。
httpd-mpm.conf中修改perfork
startServer 5 //预先开五个进程
MinSpareServers 5 //最小空闲进程
MaxSpareServers 10
ServerLimit 1000 //用于修改apache编程参数
MaxClients 150 //并发量
MaxRequestsPerChild 0 //几个进程不死(一个进程的线程数),对worker模式重要,对perfork模式不重要
我给大家一个合理的建议配置:大大部分网站,中型网站合理配置如下
5 5 10 1500 1000 0
如果你的网站访问量pv值上百万,那你可以修改maxLimit MaxClient 为2500 2000
最后,有一个关于Html 与php的访问效果图。
分享一下seo的小技巧
url
url长度 百度建议url的最长长度不超过255byte
静态页参数 在静态页面上使用动态参数,会造成spider多次与重复抓取
页面内容
meta 信息完善程度 减少keywords与description的meta标签
图片alt信息
如果一个图片希望被百度到,我们建议这样写<img alt='小狗' src="地址">有利于检索。
frame框架技术 存在frame/frameset/iframe标签
在网站前台,我们建议,不要使用frame框架,不易于seo.
flash文字信息 flash减少文字描述
如果我们给一个图片或者是视频取名字,尽量简短。
页面静态化得技术实现由两种方式:
1)使用PHP自带的缓存机制
先说明一下OB缓存的机制,看一段代码
ob1.php
<?php
echo "hello100";
header("content-type=text/html;charset=utf-8");
echo "hello200";
?>
说明:在PHP5.2这个版本,在PHP.ini有一个配置output_buffering(输出缓存,即ob缓存) ,默认是关闭的,如果是关闭的,刚才的代码就会报错。
程序 ob缓存 程序缓存 浏览器缓存
如何打开ob缓存?
第一种:配置php.ini文件,将Output_buffering=4096
第二种:在程序中加一句话:ob_start();
<?php
ob_start();
echo "hello100";
header("content-type=text/html;charset=utf-8");
echo "hello200";
//ob_end_flush(); 将ob缓存的数据,刷新到程序缓存,同时关闭ob缓存。
//ob_flush(); 将ob缓存的数据刷新到程序缓存,不关闭Ob缓存。
//ob_chean(); //清空ob中的数据。
ob_end_clean(); //清空ob缓存中的数据并关闭ob缓存。
$str=ob_get_contents();//获取ob缓存的数据
file_put_contents("d:/hsp.log".$str); //存放缓存的数
?>
ob2.php
<?php
//flush(); //将程序缓存的数据强制刷新到浏览器缓存。
echo $str_repeat('',1024); //重复地输出多次字符,这里输出1024个空格。
for($i=0;$i<5;$i++){
echo $i;
//将程序缓存的数据强制刷到浏览器缓存
flush();
sleep(1); //休眠一秒钟,即使每隔一秒显示一个数字。在sleep这个过程中,http连接没有断掉。
}
?>
几个原则:
1)如果ob缓存打开,则echo的数据首先放在ob缓存
2)如果是header信息,就直接放在程缓存。
3)当页面执行完毕,会将Ob缓存的数据放到程序缓存,然后一次返回给浏览器。
2)使用模板替换技术来实现(正则表达式)
使用ob缓存机制完成一个简单的新闻管理系统-页面静态化(目标是实现全站静态化)
开发步骤:
1)做的东西页面
2)简单地分析页面
3)创建数据表
create table news(
id int unsigned primary key auto_increment,/*新闻id做成自增id*/
title varchar(128) not null default '', /*新闻标题*/
content varchar(256) not null default '',/*新闻内容*/
filename varchar(32) not null default '' /*将来这个新闻对应的静态页面*/
) engine=MyISAM charset utf8;
测试数据
insert into news (title,content) value('hello1','北京你好');
insert into news (title,content) value('hello2','四川你好');
4)走码
newsList.php
<?php
//列出新闻列表
//这里,我使用最简单的方法来操作,没有使用mvc这种模式
//这里你们可以使用工具类完成db.class.php
$con=mysql_connect("localhost","root","root");
if(!$con){
die("连接失败");
}
mysql_select_db("newssys",$con);
$sql="select * from news";
$res=mysql_query($sql,$con);
header("content-type:text/html;charset=utf-8");
echo "<h1> 新闻列表</h1>";
echo "<a href='addNews.html'>添加新闻</a><hr/>";
echo "<table>";
echo "<tr><td>id</td><td>标题</td><td>查看详情</td><td>修改新闻</td></tr>";
//循环取出新闻列表
while($row=mysql_fetch_assoc($res)){
echo '<tr><td>'.$row['id'].'</td><td>'.$row['title'].'</td><td><a href="showNews.php?id='.$row['id'].'">查看详情</a></ta><td><a href="#">修改页面</a></td></tr>';
}
echo "</table>";
//这里关闭资源,第一句最好有,第二句可以没有。
mysql_free_result($res);
mysql_close($con);
?>
showNews.php
<?php
//传统的方法:接收新闻id,查询数据库并显示数据
$id=intval($_GET['id']);
//这里大家可以使用工具类完成
//先判断该新闻对应的静态页面是否存在,如果有,则直接返回,如果没有,则查询
$html_file="news-id".$id.".html";
if(file_exists($html_file)){
each '静态页面';
each file_get_contents($html_file);
exit;
}
$con=mysql_connetc("localhost","root","root");
if(!$con){
die("连接失败");
}
mysql_select_db("newssys","$con);
$sql="select * from news where id=$id";
$res=mysql_query($sql,$con);
//显示新闻的内容
if($row=mysql_fetch_assoc($res)){
ob_start(); //启动ob缓存
header("content-type:text/html;charset=utf-8");
each "<table><meta http-equiv='content-type' content='text/html;charset=utf-8'/></table>";
echo "<table border==1px' bordercolor='green' cellspacing='0' width=400px height=200px>";
echo "<tr><td>新闻详细内容</td></tr>";
echo "<tr><td>{$row['title']}</td></tr>";
echo "<tr><td>{$row['content']}</td></tr>";
echo "</table>";
$ob_str=ob_get_contents();
//将ob_str保存到一个静态文件页面
//取文件名有讲究,1)要唯一地标示该新闻 2)尽量利于seo
file_put_contents("news-id".$id.".html".$ob_str);
}
?>
到此,我们实现了传统的查询任务,
分析代码后,我们发现问题是,因为新闻内容相对稳定,所以,没有必要每次都去数据库查询。
优化的思路:
当第一个人查看某一个新闻时,我们便生成一个对应的静态页面,当后面的热再查看时,直接返回该静态页面即可。
代码实现:阶段代码如上。
二次优化:
再想一想上面的代码的缺点是什么?
cms(内容管理系统:新闻,软件发布,文章管理)内容就固定,我们不能接受!!!
解决方案;
第一种方案:我设一个超时,30秒,我们保证30秒内不去修改,然后超过30秒,就到数据库更新一把(这个方案仍旧有时间延时,如果我们希望静态化没有时间延时的话,就可以使用模板替换技术来搞定)
第二种方案:(模板替换技术)
addNews.html
<html>
<head>
</head>
<!--当我们在添加新闻的时候,旧同事生成一个对应的新闻页面(比如你设计好的一个新闻内容显示模板)-->
<form action="newsAction.php" method="post">
<table>
<tr><td>新闻标题</td><td><input type="text" name="title"/></td></tr>
<tr><td>新闻内容</td><td><textarea cols="%0" rows="10" name="content"></textarea></td></tr>
<tr><td><input type="submit" value="添加"/></td><td><input type="reset" value="重新填写"/></td></tr>
<!--隐藏区-->
<input type='hidden' name='oper' value='add'/>
</table>
</form>
</html>
newsAction.php
{1,将新闻入库 2,生成静态文件:将网页设计师提供的带有占位符的news.tp1模板文件读入,使用正则技术或者其它替换技术,将数据填入,最后输出一个静态页面html。}
<?php
//处理用户的添加,更新 删除等请求
//先获取oper值
$oper=$_POST['oper'];
if($oper==='add'){
//接收用户新闻的各个信息
$title=$_POST['title'];
$content=$_POST['content'];
//将新闻添加到数据库中
$con=mysql_connetc("localhost","root","root");
if(!$con){
die("连接失败");
}
mysql_select_db("newssys",$con);
$sql="insert into news values(null,'$title','$content','') ";
if(mysql_query($sql,$con)){
//生成静态文件
$id=mysql_insert_id();
$html_filename='news-id'.$id.'.html';
$html_fp=fopen($html_filename,'w');
//将模板文件读取进来
$fp=fopen('news.tpl','r');
//循环读取
//如果没有读到文件的最后,就一直读取
while(feof($fp)){
//一行一行地读取
$row=fgets($fp);
//将占位符替换掉--->小函数myreplace
//问题?
$row=str_replace('%title%',$title,$row);
$row=str_replace('%content%',$content,$row);
fwrite($html_fp,$row);
}
//关闭文件
fclose($html_fp);
fclose($fp);
echo "恭喜你,添加成功<a href='newsList.php' >点击查看新闻</a>";
}else{
die("添加失败");
}
}
?>
newsList.php
<?php
//列出新闻列表
//这里,我使用最简单的方法来操作,没有使用mvc这种模式
//这里你们可以使用工具类完成db.class.php
$con=mysql_connect("localhost","root","root");
if(!$con){
die("连接失败");
}
mysql_select_db("newssys",$con);
$sql="select * from news";
$res=mysql_query($sql,$con);
header("content-type:text/html;charset=utf-8");
echo "<h1> 新闻列表</h1>";
echo "<a href='addNews.html'>添加新闻</a><hr/>";
echo "<table>";
echo "<tr><td>id</td><td>标题</td><td>查看详情</td><td>修改新闻</td></tr>";
//循环取出新闻列表
while($row=mysql_fetch_assoc($res)){
echo '<tr><td>'.$row['id'].'</td><td>'.$row['title'].'</td><td><a href="news-id'.$row['id'].'.html">查看详情</a></ta><td><a href="#">修改页面</a></td></tr>';
}
echo "</table>";
//这里关闭资源,第一句最好有,第二句可以没有。
mysql_free_result($res);
mysql_close($con);
?>
showNews.php
<?php
//传统的方法:接收新闻id,查询数据库并显示数据
$id=intval($_GET['id']);
//这里大家可以使用工具类完成
//先判断该新闻对应的静态页面是否存在,如果有,则直接返回,如果没有,则查询
$html_file="news-id".$id.".html";
//保证文件是30秒有效。
if(file_exists($html_file) && filemtime($html_file)+30>time()){
each '静态页面';
each file_get_contents($html_file);
exit;
}
$con=mysql_connetc("localhost","root","root");
if(!$con){
die("连接失败");
}
mysql_select_db("newssys","$con);
$sql="select * from news where id=$id";
$res=mysql_query($sql,$con);
//显示新闻的内容
if($row=mysql_fetch_assoc($res)){
ob_start(); //启动ob缓存
header("content-type:text/html;charset=utf-8");
each "<table><meta http-equiv='content-type' content='text/html;charset=utf-8'/></table>";
echo "<table border==1px' bordercolor='green' cellspacing='0' width=400px height=200px>";
echo "<tr><td>新闻详细内容</td></tr>";
echo "<tr><td>{$row['title']}</td></tr>";
echo "<tr><td>{$row['content']}</td></tr>";
echo "</table>";
$ob_str=ob_get_contents();
//将ob_str保存到一个静态文件页面
//取文件名有讲究,1)要唯一地标示该新闻 2)尽量利于seo
file_put_contents("news-id".$id.".html".$ob_str);
}
?>
思考题:
1)请大家完成更新新闻的这个页面静态处理
2)如何将newsList.php也做成一个静态页面?------>思想
首页面的静态化
任务是:将新闻管理系统的首页面也静态化
CMS系统分前台与后台:后台管理(curd)我们的内容。前台首页面(手动更新)!
对我们的新闻管理系统进行首页静态化。
将所有动态文件都放入mamange文件夹。
思考一个问题:我们能不能在添加新闻后就直接静态化首页面?如果你的确希望只要首页面的内容有变化就立即更新,也可以实现,参见传智原码。
真静态的优点与缺点!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
优点:
1)利于seo
2)访问速度快
3)防止sql注入
缺点:
1)生成的html文件,占用磁盘空间。如果你使用真静态将所有的静态页放在同一文件夹,寻找文件的速度会逐渐变慢的,因此,可以考虑按照日期来创建子文件夹来放。
在一下几个情况,不建议使用真静态:
1)网站的实时性要求很高(股票,基金等)
2)数据量大,同时查询一次后,以后很少查询(国家学历认证,电信话费查询系统)
3)不愿意被seo的页面或者网站。
伪静态技术!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
在我们实际开发中,有需求,不希望使用真静态,但是又希望利于seo,可以考虑使用伪静态。
比如:
http://localhost/news.php?type=music&id=100
替换成
http://localhost/news-music-id100.html
上面的问题使用伪静态。
1。实现方式有 直接使用正则表达式来完成
2。使用apache自带的rewrite机制来完成
看需求:http://localhost/content.php/1,122,8912.html
我希望上面的地址相当于下面的地址
http://localhost/content.php?a=1&b=122&c=8912
实现思路:
1)我们可以使用str函数,来进行分割处理(这种方案可行,但不安全,也不灵活)
2)使用正则来处理。
正则入门
content.php
<?php
//需求
$str="ashdjs;ls3345dshbsfc;sdjfcjsdfjasdff8900dhscdsjkcdl2345sahd";
//请从$str这个字符串中找到连续四个数的内容
//3345 8900 2345
//去一个大字符串,找出满足某个规范的内容
//\d表示一个任意的数
$reg='/(\d)\d\d\d/i';
//$reg表示你的规则是什么,$str表示你从哪一个串里去找,$res表示找出的结果放到$res中,是一个数组
//preg_match这个函数是找到一个就停止,preg_match_all是找到所有的。
preg_match_all($reg,$str,$res);
echo "<pre>";
print_r($res);
echo "</pre>";
?>
正则表达式的细节讨论:
学号正则有三个非常重要的概念:
1)子表达式:会被捕获起来
2)捕获:请注意,如果你的正则表达式中有字表达式,则正则表达式使用单引号括起来。
3)方向引用
//举例
$str2="1111sdfsdvgds9999dvfgxfvf0000";
//请找出连续的四个一样的数
//说明
//正则规范的格式: /规范/i i表示在匹配时不区分大小写。
// \d表示任意一个数
// (\d) 表示是一个子表达式
// \1 表示第一个字表达式的内容,应该出现在这
// {3} 表示出现3次。
//
$reg2='/(\d)\1{3}/i';
//举例
$str3="111-555-666xvxvb888-000-555";
//请大家找出满足xxx-yyy-zzz规则格式的内容,正则规范如何写?
$reg='/ (\d)\1{2}-(\d)\2{2}-(\d)\2{2} /i';
//举例
$str4="111=575-111 sdfsdf888-000-555";
//请大家找出满足xxx-yzy-xxx这种规则的
$reg4='/ (\d)1{2}-(\d)\d\2-\1{3} /i ';
举例:
$str5="[email protected]";
//请大家验证一下这个是不是一个电子邮件
//比如我们认为满足如下条件就是电子邮件
//1,必须有@
//2,@之前必须是a-z A-Z 或者_ 字符
//3,要求必须是新浪与搜狐的sina sohu
//4,必须有.后缀是com 或者cn
//说明:^(放在小括号内外的效果表示不一样,在括号内表示出了括号内的以外的都可以)表示必须以什么开头,|表示出现新浪或者搜狐,\.表示出现.本身,如果不转义,.表示出了\n(换行符)之外的所有字符。$表示必须以什么什么结尾。
$reg='/^([a-zA-Z_]+)@(sina|sohu)\.(com|cn)$ /i'
if(preg_match_all($reg2,$str2,$res)==1){
echo "是电子邮件";
}else{
echo "不是电子邮件";
}
preg_match_all($reg2,$str2,$res);
echo "<pre>";
print_r($res);
echo "</pre>";
正则表达式在编程中具体在什么地方使用???
1)正则规范是一个根本的规范,可以在js中,可以在php asp.net java c/c++中使用
2)在我们编程过程中,在涉及到用户输入用户输入数据的程序中应当加入正则验证。在客户端与服务端都要验证,不同的是,客户端使用js,在服务器端使用php.
特殊的说明:
在正则规范中,我们可能会看到(?:pattern) (?!pattern) (?<|parttern)(?=pattern)(?<=pattern)
(?:pattern) 非捕获匹配
参考说明文档:
可以看一篇文章:环视(面试时问的少,用到的也比较少)
看需求:http://localhost/content.php/1,122,8912.html
我希望上面的地址相当于下面的地址
http://localhost/content.php?a=1&b=122&c=8912
实现思路:
1)我们可以使用str函数,来进行分割处理(这种方案可行,但不安全,也不灵活)
2)使用正则来处理。
我们采用第二种方案:
<?php
$path_info=$_SERVER['PATH_INFO'];
$reg='/(\d+),(\d+),(\d)+\.html$ /i';
preg_match($reg,$path_info,$res);
echo "<pre>";
print_r($res);
echo "</pre>";
课堂练习:找出一个字符串中有多少中文?
reg1.php
<?php
$str="124254234北京你好hsdjsfhcd你是什么adgsjfhjsdhj是实物时间段内啥饭会计师45bhcdj";
//要求请查询出有多少汉字,有多少字母,有多少数字
//思路:中文字的utf-8编码的范围\x4e00-\x9fa5
$reg='/[\x4e00-\x{9fa5}] /iu';
preg_match_all($reg1,$str,$res);
echo "汉字有".count($res[0])."个";
echo "<pre>";
print_r($res);
echo "</pre>";
$reg='/[a-zA-Z] /i';
preg_match_all($reg2,$str2,$res2);
echo "字母有".count($res2[0])."个";
$reg='/[0-9] /i';
preg_match_all($reg3,$str3,$res3);
echo "字母有".count($res3[0])."个";
?>
出题:结巴程序
我给出一个字符串 ”我要要学学学……php“换成”我要学Php“
在实际开发中,我们实现这个伪静态用得更多的还是rewrite机制,但它仍然是以正则技术为基础的。
我们看看如何实现?
说明:比如http://www.hsp.com/news.php?type=music&id=100
变成
http://www.hsp.com/news-music-id100.html
准备:在httpd.conf文件中启用rewrite模块
步骤:
1)在httpd.conf中启用rewrite机制
搜索rewrite,去掉#
确认是否启用成功
<?php phpinfo() ;?> 在phpload模块列表中找一下即可。
2)配置我们的虚拟主机
在httpd.conf中打开虚拟主机的配置文件:搜vhost,打开即可
再去修改httpd-vhosts.conf文件:参考韩老师的笔记即可
3)在hosts文件中配置ip与主机的对应关系(再重启apache)
127.0.0.1 www.hsp.com
4)这时我们访问http://www.hsp.com/news.php我们可以访问该页面
一个重要的知识点:在apache服务器中,如果某个文件夹没有指定访问的权限,则以上级目录的权限为准。如果它自己制定了访问权限,则以自己制定的权限为准。
请注意:在配置访问权限的时候,order deny,allow的顺序很重要。
5)关于<Directory>节点配置必须掌握
比较完整的配置文件参见韩顺平的课堂笔记。
特别说明:容易犯错的
一定要记住,启用rewrite模块。
第二种配置方式
思考:上面我们配置都要去修改httpd-vhost文件,但管理员不给你这个权限,怎么办?
思路:可以将配置写到一个叫.htaccess文件中
在static文件夹下新建.htaccess文件(另存为这个名字的文件)
第三种配置方式:
参见韩顺平的笔记。
伪静态的实际运用:(防盗链)
1:在一个项目中,有两个文件夹,public与private,public文件夹的图片可以被所有人访问,private只能被自己访问,如何实现???
第一个方法是:在public于private下创建.htaccess文件,对于private只让127.0.0.1访问,public文件夹都可以访问。
private文件夹下的配置
Order deny,allow
deny from all
allow from 127.0.0.1
这个的缺点是封杀太厉害了,没有办法去控制本apache的另外一个虚拟主机的请求。另外,不能精细化控制,于是我们就换了一个思路,使用http的referer头信息搞定这个防盗链需求。
第二种方法:我们在private文件夹下谢了.htaccess
内容
<ifModule rewrite_module>
RewriteEngine On
#你怎么知道,这个请求就是www.hsp.com发来的. referer
#如果你请求的是一个jpg图片, 就禁止
RewriteCond %{HTTP_REFERER} !www.hsp.com
RewriteRule .*\.jpg -[F]
</ifModule>
如果你的RewriteCond有多个条件
<ifModule rewrite_module>
RewriteEngine On
#你怎么知道,这个请求就是www.hsp.com发来的. referer
#如果你请求的是一个jpg图片, 就禁止
RewriteCond %{HTTP_REFERER} !www.hsp.com
#RewriteCond %{ REQUEST_FILENAME} !-f
RewriteRule .*\.jpg -[F]
</ifModule>
课堂练习
配置虚拟主机 www.你的名字.com
[网站欢迎页面/404/rewrite正则规范
网站 public private public的图片可以访问,但是private图片不能访问 一定走一遍! ]
对昨天讲解的内容的一个补充说明:
1:关于404的说明:当404.html的内容大小小于512b字节时,就不会被ie运行显示出来。
2:如果你在<Directory>这个节点配置了Option Indexex,同时你又启用了rewriteEngine On ,你会看到403的forbidden禁用提示,原因是因为我们的父级目录的Options本身就配好,Option Indexex FollowSymLinks,所以,我们要么就不配,要么就一样。
伪静态的实际运用案例2
需求:
参考韩顺平笔记。