HTTP协议的相关应用
php+socket请求原理
1:连接某URL的80端口(打开)
2:发送头信息(写)
3:读取网页内容(读)
Http协议模拟登陆发帖
要点为抓包构造头信息,发送cookie。
Http协议之referer防盗链
当我们在网页里引用站外图片时,会出现上述情况。那么服务器是怎么知道这个图片是在站外被引用的呢?
在Http协议中,头信息里有一个重要的选项:Referer,代表网页的来源,既上一页的地址,如果是直接在浏览器上输入地址,回车进来,则没有Referer。
配置apache服务器,用于图片防盗链?
原理:在web服务器层面,根据http协议的referer头信息来判断。如果来自站外,则统一重写到一个很小的防盗链图片上去。
具体步骤:1.打开apache重写模块mod_rewrite,2.在需要防盗链的网站或目录,写.htaccess文件,并指定防盗链规则,分析referer信息,如果不是来自本站,则重写。
重写规则:
①哪种情况下重写:是jpeg/jpg/gif/png图片时,referer头与localhost不匹配时重写,统一rewrite到某个防盗链图片
RewriteEngine OnRewrite Base /test
RewriteCond %{REQUEST_FILENAME} .*\.(jpg|jpeg|gif|png) [NC]
RewriteCond %{HTTP_REFERER} !localhost [NC]
RewriteRule .* no.png
伪造referer头采集防盗链图片:
<?php
require('./http.class.php');
$http = new Http('http://localhost/test/test.jpg'); //图片路径
$http->setHeader('Referer: http://localhost'); //伪造referer
$res = $http->get();
//应该判断路径或response的mime头信息,来确定图片的类型
file_put_contents('./aa.jpg',substr(strstr($res,"\r\n\r\n"),4));
Http协议缓存控制
观察图片的请求往往第一次请求时200 ok,第二次请求时 304 Not Modified未修改状态
解释:在网络上,有一些缓存服务器,另,浏览器自身也有缓存功能,当我们第一次访问某图片时,返回值200,第二次去访问时,基于一个前提-图片不会经常改动,服务器在返回200的同时,还返回改图片的“签名”--Etag(签名可以理解为图片的“指纹”),当浏览器再次访问图片时,去服务器校验"指纹",如果图片没有变化,直接使用缓存中的图片,这样减轻了服务器的负担。
抓包:
第一次请求头:
第一次响应头:
第二次请求头:
这2行的意思是:如果自"Sat, 16 Apr 2016 14:08:51 GMT"这个时间点以后图片修改过,则重写请求。如果该图片最新的Etag的值和If-None-Match的值不匹配,则重写请求。
第二次响应头:
如果是304,就意味着浏览器从本地取缓存,节省了图片在网络上传输的时间。
网站缓存控制
网站比较大,有N台缓存服务器,那么这N台服务器如何处理主服务器上的文件,要不要缓存,缓存多久?这说明缓存服务器与主服务器之间,应该有一些协议来说明这2个问题?http协议头信息cache-control来控制。
具体用法:
在主服务器,打开apache的expires(expires_module)扩展,利用该扩展来控制图片,css,html等文件控制是否缓存,及缓存生命周期。
在.htaccess中,具体语法如下:
ExpiresDefault "<base> [plus] {<num> <type>}*"
ExpiresByType type/encoding "<base> [plus] {<num> <type>}*"
ExpiresDefault是设置默认的缓存参数
ExpiresByType是按照文件类型来设置独特的缓存参数
后面4个参数意思:
Base:基于哪个时间点来计算缓存有效期
Access/now:基于请求/响应的那一瞬间,比如从此瞬间到1个月之后.
Modification:基于被请求文件的最后修改日期来计算,比如最后修改日期的后1周内仍然有效。
Num:缓存时间的大小 (30)
Type:缓存时间的单位 (天,月...)
ExpiresActive On ExpiresByType image/jpeg "access plus 1 months"
如果这是在集群环境里,缓存服务器得到此图片,将会认为一个月有效,减轻了主服务器负担。
设置服务器,不让用缓存
如有些个人信息,不允许缓存服务器缓存,必须到主服务器去请求。
Control-cache:no-store,must-revalidate; //这意味着不允许缓存,必须去主服务器验证。
可以利用Apache的header模块(headers_module)
<FilesMatch "\.(jpg)$"> header set Cache-control "no-store,must-revalidate" </FilesMatch>
多次刷新浏览器.jpg的图片返回状态一直是200,服务器不再缓存该类型的图片,每一次都重新请求
Http协议内容压缩
当我们访问一些大型网站的时候,发现主体长度和content-length不一致,这是因为Content-Encoding:gizp这个响应头在作用。
原理:为了提高网页在网络上的传输速度,服务器对主体信息进行压缩,如常见的gzip压缩,deflate压缩,compress压缩,以及google chrome的sdch压缩。
服务器对页面进行了压缩,而content-length是"压缩后"的长度
在Apache启用压缩功能?
①开启deflate模块(deflate_module)或gzip模块
②在conf文件中,写如下代码:
<ifmodule mod_deflate.c> DeflateCompressionLevel 6 #压缩级别为6,可选1-9,推荐为6 AddOutputFilterByType DEFLATE text/plain #压缩文本文件 AddOutputFilterByType DEFLATE text/html #压缩html文件 AddOutputFilterByType DEFLATE text/xml #压缩xml文件 </ifmodule>
压缩也是要消耗CPU资源的,图片/视频等文件,压缩效果不好,一般压缩文本格式
服务器如何知道我们的浏览器支持gizp的
客户端允许一个Accept-Encoding头信息,与服务器协商.
可以看出,chrome浏览器支持gizp,deflate,sdch三种压缩
可以看出,Firefox浏览器支持gizp,deflate二种压缩
Http协议与持久链接+分块传输-->反向ajax
反向ajax又叫comet,server push,服务器推技术,应用范围:网页聊天服务器,新浪微博在线聊天,google mail网页聊天都有应用。
原理:一般而言,Http协议的特点,连接<-->断开。
具体什么时间断开?
服务器响应content-length,收到指定length长度的内容时,也就断开了,在http1.1协议中,允许你不写content-length,比如要发送的内容长度确实不知道时,这时,需要一个特殊的content-type:chunked
分块传输原理:
123H\r\n
123H个长度的内容传输给客户端....\r\n
......
41H\r\n
浏览器继续接收41H长度的内容.\r\n
0\r\n(服务器说内容发完了)
<?php
set_time_limit(0);
ob_start();
$pad = str_repeat(' ',4000);
echo $pad,'<br/>';
ob_flush();
flush(); //把产生的内容立即发送给浏览器而不要等脚步结束再一起送。
$i=1;
while($i++){
echo $pad,'<br/>';
echo $i,'<br/>';
ob_flush();
flush(); //把产生的内容立即发送给浏览器而不要等脚步结束再一起送。
sleep(1);
}
浙公网安备 33010602011771号