1. 什么是HTTP协议
我们知道HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传送协议。它是一种分布式,合作式,多媒体住处系统服务,面向应用层的协议(同时它也是基于网络层tcp协议的)。
2.HTTP协议是怎么工作的
当我们想浏览一个网站的时候,如www.dianyuan.com。建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URI)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。然后电源网(www.dianyuan.com)服务器接到请求后,给予相应的响应信息其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。最后 客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客户机与服务器断开连接。这就是完整的HTTP协议的工作过程。
3.HTTP协议的基础。
浏览器和web服务器之间通过http在internet上进行数据的发送和接收,这些数据也被称为http消息(message)。http消息可以是客户端到服务器的请求消息,也可以是服务器到客户端
消息(message)的一般格式:
Message = start-line (Request-line | status-line)
*message-header
CRLF
[message-body]
我们先看请求信息内容
(1). 请求内容的组成:
Message=Request-line
*message-header
CRLF
[message-body]
(2)请求行的结构(Request-line):
Reqest-Method Request-URI HTTP-Version CRLF
*Request-Method: 请求方法:POST,GET,PUT,DELETE(注意要大写)
*HTTP-Version: http协议的版本(1.0/1.1)
*注:CRLF为回车换行;
(3)例子:
Message = POST ./li.php HTTP/1.0\nUser_Agent: XML-RPC Client\nHost: www.dianyua.com\nContent-Type:image/png\nContent-Length: 8\n\n[message-body];
*注:[message-body]自己定义:如username=yaoming&pwd=123
我们再看响应消息内容
(1)响应内容:message=status-line
* message-header
[message-body]
(2)状态行:status-line的结构:
HTTP-Version status-code Reason-Phrase
CRLF
*注:状态码:status-code:
状态码表示响应类型
1×× 保留
2×× 表示请求成功地接收
3×× 为完成请求客户需进一步细化请求
4×× 客户错误
5×× 服务器错误
*注:404—没有找到
*注:401—未授权
*注:403—-禁用
我们再来看看HTTP消息报头内容
1.Message-header分为普通报头(general-header ),请求报头( Request-header ) , 实体报头(entity-header)
2.报头的格式:名字+“:”+空格+值
(1)普通报头:gengerl-header
<1>Cache-Control
Cache-Contrlol 常用头域被用于指定指令,此指令必须被在请求/响应链上的所有缓存机制遵守。注意HTTP/1.0缓存并不能实现Cache-Control,而是只实现Pragma:no-cache..请求时的缓存指令包括no-cache、no-store、max-age、max-stale、min-fresh、only-if-cached,响应消息中的指令包括public、private、no-cache、no-store、no-transform、must-revalidate、 proxy-revalidate、max-age。
<2>Date
Date头域表示消息发送的时间,时间的描述格式由rfc822定义。例如,Date:Mon,31Dec200104:25:57GMT。Date描述的时间表示世界标准时,换算成本地时间,需要知道用户所在的时区。
<3> Pragma
Pragma头域用来包含实现特定的指令,最常用的是Pragma:no-cache。在HTTP/1.1协议中,它的含义和Cache-Control:no-cache相同。
(2)请求信息报头(Request-header)
<1>Host
Host头域指定请求资源的Intenet主机和端口号,必须表示请求url的原始服务器或网关的位置。HTTP/1.1请求必须包含主机头域,否则系统会以400状态码返回。
<2>Referer
Referer头域允许客户端指定请求uri的源资源地址,这可以允许服务器生成回退链表,可 用来登陆、优化cache等。他也允许废除的或错误的连接由于维护的目的被追踪。如果请求的uri没有自己的uri地址,Referer不能被发送。如果指定的是部分uri地址,则此地址应该是一个相对地址。
<3>Accept
Accept请求头域被用于指定服务器返回客房端可接受的响应媒体类型。如:image/png,text/html等;
<4>Accept-Charset
此头域可以用来指出请求客房端能接受什么样的字符集响应。如: utf8,iso-8859-5;
<5>Accept-Language,Authorization,From,Host,If-Modified-Since,User-Agent等等
(3)响应报头(Response-head);
<1>Expires
它给出了在何日何时之后响应即被视为陈旧的。一个陈旧的缓存项不能被缓存返回级客房端。它的日期格式是绝对日期。由HTTP-date定义的。它必须是RFC1123的格式。例如:Thu,01 Dec 1994 16:00:00 GMT
<2>Content-Encoding
它是对媒体类型的修饰。其值表明对实体以何种方式的内容编码。
<3>Content-Language
它描述了实体面向用户的语言。
<4>Content-Type
指明发给接收者的实体的媒体类型。Content-Type: text/html;charset=ISO-8859-4
当然这里面还有很多关于报头的命令,这里不一一列举。
4.最后我们来看看php与HTTP的结合
Php内建的函数和全局变量都可以获取对HTTP请求中传递的任何消息的内容
(1).getallHeaders() =>返回的是一个数组
(2) 超全局变量$_SERVER, HTTP_HOST,HTTP_PORT,HTTP_ACCEPT,REQUEST_METHOD
Php与响应
Php中使用header()将HTTP响应状态行和报头发送到浏览器
header ( string string [, bool replace [, int http_response_code]] )
(1).返回状态行:
header(“HTTP/1.0 404 NOT FONUD”);
(2).返回响应报头
Header(“WWW-Authenticte:BASIC”);
(3).重定向,设置内容和类型
(4)php禁止客房端缓存:
<?php header(“Expries: Thu,01 Jun 1970 00:00:00 GMT”);</br> header(“Last-Modify:”.gmdate(“D,d M Y H:i:s”.”GMT”)); header(“Cache-control: no-store, no-cache,must-revalidate”); header(“Cache-control: post-check,pre-check=0”,false);header(“prama:no-cache”); ?>
<5>php模拟HTTP请求:
<?php
$host=”localhost”;
$port=80;
$request=”username=yaoming&pwd=123″;
$fp = fsockopen($host, $port);
$query=”POST/zxu.phpHTTP/1.0\r\nUser_Agent:Client\r\nHost:”.$host.”\r\nAccept:*/*\r\nContent-Type:application/x-www-form-urlencoded;charset=UTF-8\r\nContent-Length:”.strlen($request).”\r\n\r\n”.$request.”\n”;
echo $query;
//把构造好的HTTP协议发送给服务器,失败返回false
if (!fputs($fp, $query, strlen($query)))
{
$errstr = “Write error”;
return false;
}
//获取从服务器端返回的所有信息,包括HTTP头和XML信息
$contents = “”;
while (!feof($fp))
{
$contents .= fgets($fp);
}
//关闭连接资源后返回获取的内容
fclose($fp);
echo $contents;
?>


