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);
} 
posted on 2016-10-05 20:18  gimin  阅读(575)  评论(0)    收藏  举报