超文本传送协议(HTTP)是一种通信协议, 它许可将超文本标记措辞(HTML)文档从Web做事器传送到Web浏览器。
1.http协议是建立在tcp/ip协议根本上;
2.我们的web开拓数据的传输都是依赖于http协议;

3.http协议全称是 超文本传输协议;
URL(统一资源定位符)
Uniform Resource Locator
统一资源定位符
http://www.xxxxxx.com:80/index.php
协议:http(信鸽)
主机:www.xxxxxx.com
端口号:80 所有浏览器默认要求都是80端口
资源:/index.php
HttpWatch软件(强大的网页数据剖析工具)
Stream(流)
左边:客户端向做事器端发送数据流
右边:做事器端向客户端返回数据流
http协议的-http要求(request)细节(客户端向做事器端发送数据流)
客户端连上做事器后,向做事器要求某个web资源,称之为客户端向做事器发送了一个HTTP要求。
一个完全的HTTP要求包括如下内容:一个要求行、多少头、以及实体内容,个中的一些头和实体内容都是可选的,
头和实体内容之间要用空行隔开。如下所示:
基本构造
要求行
头
<----空行
体(实体内容)
举例:
GET /test/hello.html HTTP/1.1
【表示发送的get要求, 要求资源是/test/hello.html 】
Accept: / 【表示客户端可以接管任何数据】
Referer: http://localhost:80/test/abc.html 【1.表示我是从哪里来】
Accept-Language: zh-cn 【页面措辞】
User-Agent: Mozilla/4.0 【见告做事我的浏览器的内核,操作系统】
Accept-Encoding: gzip, deflate 【表示接管什么样的数据压缩格式.】
Host: localhost:80 【主机:80】
Connection: Keep-Alive 【表示不要立即断掉我们的要求.】
现在我们想知道,客户端究竟给做事器发送的内容
如果我这个http1.php. 不肯望 192.168.1.33 这个用户访问.
在做事器端,我们可以通过$_SERVER来获取我们须要的信息
主要的有:
HTTP_HOST 当前要求头中Host
REMOTE_ADDR 访问该页面的ip
DOCUMENT_ROOT 可以获取 apche的主目录
REQUEST_URI 可以获取 要求的资源名
http要求有两种紧张的办法
get / post
GET提交,要求的数据会跟在URL之后例如:login.php?name=abc&password=kkk
POST提交:把提交的数据放置在是HTTP包的包体中。比如:
POST /test/reg.php HTTP/1.1
Host:
Content-Type:
Content-Length:
<--空行
name=abc&password=xyz
get和post的差异有哪些
1. GET提交的数据会在地址栏中显示出来,而POST提交,地址栏不会改变
2. 安全性:get要求的数据会显示在地址栏上, post要求的数据,放在http协议的体,post安全性高
3. 从可以提交数据的大鄙视:http协议本身并没有限定数据大小。GET:特定浏览器和做事器对URL长度有限定,
例如IE对URL长度的限定是2083字节(2K+35)。对付其他浏览器,如Netscape、FireFox等,理论上没有长度限定,其限定取决于操作系统的支持。
因此对付get提交时,传输数据就会受到URL长度的限定。post:由于不是通过URL传值,理论上数据不受限。
4. get要求可以更好的添加到收藏夹;
用于HTTP要求中的常用头
Accept: text/html,image/
Accept-Charset: ISO-8859-1
Accept-Encoding: gzip,compress
Accept-Language: en-us,zh-cn
Host: www.sohu.com:80
If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT
Referer: http://www.sohu.com/index.php
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)
Cookie
Connection: close/Keep-Alive
Date: Tue, 11 Jul 2003 18:23:51 GMT
当做事器须要知道要求是来自哪个ip等信息,就可通过程序得到相应的信息。
防止盗链的关键程序:
'HTTP_REFERER' 勾引用户代理到当前页的前一页的地址(如果存在)。
由 user agent 设置决定。并不是所有的用户代理都会设置该项,有的还供应了修正 HTTP_REFERER 的功能。简言之,该值并不可信。
<?phpif(isset($_SERVER['HTTP_REFERER'])){ //判断是否是空值//取出来//判断$_SERVER['HTTP_REFERER']是不因此本网站网址开头的if(strpos($_SERVER['HTTP_REFERER'],"网站域名")==0){echo "你没有盗链";//语句....}else//跳转到警告页面header("Location:warning.php");}else{header("Location:warning.php");}?>
http相应(response)做事器端向客户端返回数据流(以下的内容都是基于做事器端向客户端发送的信息)
大略定义: 一个Http相应代表做事器给浏览器回送的数据,同时见告浏览器应该若何处理数据;(表示做事器相应客户端浏览器的信息)
1. 基本构造
状态行
头信息
<--空行
实体信息
快速入门
HTTP/1.1 200 OK 【200 ok 表示客户端要求成功】
Server: Microsoft-IIS/5.0 【表示见告浏览器 做事器的情形 】
Date: Thu, 13 Jul 2000 05:46:53 GMT 【见告浏览器要求的页面的韶光 】
Content-Length: 2291 【表示回送的数据有2291个字节】
Content-Type: text/html 【文档类型】
Cache-control: private 【缓存】
<--空行
hello 实体细节
HTTP相应的细节--状态行
格式:HTTP版本号 状态码 缘故原由阐述<CRLF>
单例:HTTP/1.1 200 OK
状态码用于表示做事器对要求的处理结果,它是一个三位的十进制数,相应状态码分为5类
状态码 含义
100~199 表示成功吸收要求,哀求客户端连续提交下一次要求才能完玉成部处理过程
200~299 表示成功吸收要求并已完玉成部处理过程,常用200
300~399 为完成要求,客户需进一步细化要求。例如,要求的资源已经移动一个新地址,常用302、304
400~499 客户真个要求有缺点,常用404
500~599 做事器端涌现缺点,常用 500
举例解释Http相应的实际运用:
302状态码利用:
比如我们现在希望访问a.php 页面,让其自动重定向到b.php
基本用法利用
<?php/header("Location: 新的页面");这句话会向客户端发送一个302状态码;(发送的是两个要求状态码,首先发送302状态码,见告浏览看重新访问新的页面,然后做事器再发送200状态码)/header("Location: http://www.sohu.com");exit();?>
细节: 302 状态码也可以让其跳转到外网去
404状态码利用:
404 最常见的状态码 404一样平常说便是该页面不存在
304状态码利用:
304 码紧张是见告浏览器,要求的资源不须要更新(理解:由于文件已经缓存了,就不须要更新)
<?phpecho "hello";echo "<img src="Sunset.jpg" width="100px">"?>
以上代码访问了一次,再重新打开时,则做事器向客户端浏览器发送304状态码,见告浏览器,要求的图片不须要更新
上面解释了304的详细用法
HTTP/1.1 304 Not Modified
Date: Tue, 13 Sep 2011 02:10:38 GMT
Server: Apache/2.2.17 (Win32) PHP/5.3.5
Connection: Keep-Alive
Keep-Alive: timeout=5, max=99
ETag: "12d00000000572c-6f69-3e1d849f35000"
下面是比较详细的一个Http相应
Location: http://www.baidu.org/index.php
Server:apache
Content-Encoding: gzip 【内容编码支持gzip压缩算法】
Content-Length: 80 【返回数据大小】
Content-Language: zh-cn
Content-Type: text/html; charset=GB2312
Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT 【表示浏览器要求资源,最新韶光】
Refresh: 1;url=http://www.baidu.com 【见告浏览器,间隔1秒,重定向到 baidu】
Content-Disposition: attachment; filename=aaa.zip
Transfer-Encoding: chunked
Set-Cookie:SS=Q0=5Lb_nQ; path=/search 【讲Cookie】
Expires: -1
Cache-Control: no-cache
Pragma: no-cache
Connection: close/Keep-Alive
Date: Tue, 11 Jul 2000 18:23:51 GMT
演示如何通过Http相应,掌握浏览器间隔一定韶光去跳转.
<?php//header("Refresh: 3 ; url=http://www.sohu.com");header("Refresh: 3 ; url=http://localhost/http/d.php");?>
演示如何通过Http相应掌握页面缓存,在默认情形下,浏览器会缓存页面.
<?php//通过header来禁用缓存(ajax )header("Expires: -1");header("Cache-Control: no_cache");header("Pragma: no-cache");echo "hello!cache";?>
//下载文件须要的头
header("Content-type: application/octet-stream"); //见告浏览器返回的是文件(即输出MIME类型)
header("Accept-Ranges: bytes"); //见告浏览器按照字节大小返回,可以不要此行语句,最好保留
header("Accept-Length: $file_size"); //文件大小
header("Content-Disposition: attachment; filename=".$file_name); //这里是客户端弹出的对话框,对应的文件名
演示Http实际运用的 文件下载
代码如下:
<?php //函数的利用解释 //参数解释 $filename 文件名称 // $file_sub_dir: 下载文件的子路径 "/xxx/xxx/" function down_file($filename,$file_sub_dir){ //演示下载图片. //如果文件是中文. // 须要对中文转码 gb2312 $file_name=iconv("utf-8","gb2312",$file_name); //绝对路径 $file_path=$_SERVER['DOCUMENT_ROOT'].$file_sub_dir.$file_name; //如果你希望绝对路径 // 判断文件是否存在 if(!file_exists($file_path)){ echo "文件不存在!"; return ; } // 打开文件 $fp=fopen($file_path,"r"); //获取下载文件的大小 $file_size=filesize($file_path); if($file_size>50){ echo "<script language='javascript'>window.alert('文件过大')</script>"; return ; } // 设置HTTP协议的要求头参数 //返回的文件 header("Content-type: application/octet-stream"); //通用所有的格式 //按照字节大小返回 header("Accept-Ranges: bytes"); //返回文件大小 header("Accept-Length: $file_size"); //这里客户真个弹出对话框,对应的文件名 header("Content-Disposition: attachment; filename=".$file_name); //向客户端回送数据 $buffer=1024; //为了下载的安全,我们最好做一个文件字节读取计数器 $file_count=0; //这句话用于判断文件是否结束 while(!feof($fp) && ($file_size-$file_count>0) ){ $file_data=fread($fp,$buffer); //统计读了多少个字节 $file_count+=$buffer; //把部分数据回送给浏览器; echo $file_data; } //关闭文件 fclose($fp); } //测试函数是否可用 down_file("zhangsan.jpg","/data/download/"); //第二个参数必须是根路径?>