关于http文件头的文档.docx
- 文档编号:24139803
- 上传时间:2023-05-24
- 格式:DOCX
- 页数:19
- 大小:28.44KB
关于http文件头的文档.docx
《关于http文件头的文档.docx》由会员分享,可在线阅读,更多相关《关于http文件头的文档.docx(19页珍藏版)》请在冰豆网上搜索。
关于http文件头的文档
深入理解HTTP消息头转载自:
[http:
//www.php-]
(一)初识HTTP消息头
但凡搞WEB开发的人都离不开HTTP(超文本传输协议),而要了解HTTP,除了HTML本身以外,还有一部分不可忽视的就是HTTP消息头。
做过Socket编程的人都知道,当我们设计一个通信协议时,“消息头/消息体”的分割方式是很常用的,消息头告诉对方这个消息是干什么的,消息体告诉对方怎么干。
HTTP传输的消息也是这样规定的,每一个HTTP包都分为HTTP头和HTTP体两部分,后者是可选的,而前者是必须的。
每当我们打开一个网页,在上面点击右键,选择“查看源文件”,这时看到的HTML代码就是HTTP的消息体,那么消息头又在哪呢?
IE浏览器不让我们看到这部分,但我们可以通过截取数据包等方法看到它。
下面就来看一个简单的例子:
首先制作一个非常简单的网页,它的内容只有一行:
helloworld把它放到WEB服务器上,比如IIS,然后用IE浏览器请求这个页面(http:
//localhost:
8080/simple.htm),当我们请求这个页面时,浏览器实际做了以下四项工作:
1解析我们输入的地址,从中分解出协议名、主机名、端口、对象路径等部分,对于我们的这个地址,解析得到的结果如下:
协议名:
http
主机名:
localhost
端口:
8080
对象路径:
/simple.htm
2把以上部分结合本机自己的信息,封装成一个HTTP请求数据包
3使用TCP协议连接到主机的指定端口(localhost,8080),并发送已封装好的数据包
4等待服务器返回数据,并解析返回数据,最后显示出来
由截取到的数据包我们不难发现浏览器生成的HTTP数据包的内容如下:
GET/simple.htmHTTP/1.1
Accept:
image/gif,image/x-xbitmap,image/jpeg,image/pjpeg,application/x-shockwave-flash,application/vnd.ms-excel,application/vnd.ms-powerpoint,application/msword,*/*
Accept-Language:
zh-cn
Accept-Encoding:
gzip,deflate
User-Agent:
Mozilla/4.0(compatible;MSIE6.0;WindowsNT5.1;SV1;.NETCLR1.1.4322;.NETCLR2.0.50727)
Host:
localhost:
8080
Connection:
Keep-Alive
为了显示清楚我把所有的回车的地方都加上了“
消息的第一行“GET”表示我们所使用的HTTP动作,其他可能的还有“POST”等,GET的消息没有消息体,而POST消息是有消息体的,消息体的内容就是要POST的数据。
后面/simple.htm就是我们要请求的对象,之后HTTP1.1表示使用的是HTTP1.1协议。
第二行表示我们所用的浏览器能接受的Content-type,三四两行则是语言和编码信息,第五行显示出本机的相关系信息,包括浏览器类型、操作系统信息等,很多网站可以显示出你所使用的浏览器和操作系统版本,就是因为可以从这里获取到这些信息。
第六行表示我们所请求的主机和端口,第七行表示使用Keep-Alive方式,即数据传递完并不立即关闭连接。
服务器接收到这样的数据包以后会根据其内容做相应的处理,例如查找有没有“/simple.htm”这个对象,如果有,根据服务器的设置来决定如何处理,如果是HTM,则不需要什么复杂的处理,直接返回其内容即可。
但在直接返回之前,还需要加上HTTP消息头。
服务器发回的完整HTTP消息如下:
HTTP/1.1200OK
Server:
Microsoft-IIS/5.1
X-Powered-By:
ASP.NET
Date:
Fri,03Mar200606:
34:
03GMT
Content-Type:
text/html
Accept-Ranges:
bytes
Last-Modified:
Fri,03Mar200606:
33:
18GMT
ETag:
"5ca4f75b8c3ec61:
9ee"
Content-Length:
37
同样,我用“
可以看到,这个消息也是用空行切分成消息头和消息体两部分,消息体的部分正是我们前面写好的HTML代码。
消息头第一行“HTTP/1.1”也是表示所使用的协议,后面的“200OK”是HTTP返回代码,200就表示操作成功,还有其他常见的如404表示对象未找到,500表示服务器错误,403表示不能浏览目录等等。
第二行表示这个服务器使用的WEB服务器软件,这里是IIS5.1。
第三行是ASP.Net的一个附加提示,没什么实际用处。
第四行是处理此请求的时间。
第五行就是所返回的消息的content-type,浏览器会根据它来决定如何处理消息体里面的内容,例如这里是text/html,那么浏览器就会启用HTML解析器来处理它,如果是image/jpeg,那么就会使用JPEG的解码器来处理。
消息头最后一行“Content-Length”表示消息体的长度,从空行以后的内容算起,以字节为单位,浏览器接收到它所指定的字节数的内容以后就会认为这个消息已经被完整接收了。
理解HTTP消息头
(二)
常见的HTTP返回码
上一篇文章里我简要的说了说HTTP消息头的格式,注意到在服务器返回的HTTP消息头里有一个“HTTP/1.1200OK”,这里的200是HTTP规定的返回代码,表示请求已经被正常处理完成。
浏览器通过这个返回代码就可以知道服务器对所发请求的处理情况是什么,每一种返回代码都有自己的含义。
这里列举几种常见的返回码。
1403AccessForbidden
如果我们试图请求服务器上一个文件夹,而在WEB服务器上这个文件夹并没有允许对这个文件夹列目录的话,就会返回这个代码。
一个完整的403回复可能是这样的:
(IIS5.1)
HTTP/1.1403AccessForbidden
Server:
Microsoft-IIS/5.1
Date:
Mon,06Mar200608:
57:
39GMT
Connection:
close
Content-Type:
text/html
Content-Length:
172
DirectoryListingDenied
ThisVirtualDirectorydoesnotallowcontentstobelisted.2404Objectnotfound
当我们请求的对象在服务器上并不存在时,就会给出这个返回代码,这可能也是最常见的错误代码了。
IIS给出的404消息内容很长,除了消息头以外还有一个完整的说明“为什么会这样”的网页。
APACHE服务器的404消息比较简短,如下:
HTTP/1.1404NotFound
Date:
Mon,06Mar200609:
03:
14GMT
Server:
Apache/2.0.55(Unix)PHP/5.0.5
Content-Length:
291
Keep-Alive:
timeout=15,max=100
Connection:
Keep-Alive
Content-Type:
text/html;charset=iso-8859-1
DOCTYPEHTMLPUBLIC"-//IETF//DTDHTML2.0//EN">
NotFound
TherequestedURL/notexistwasnotfoundonthisserver.
Apache/2.0.55(Unix)PHP/5.0.5ServeratlocalhostPort8080
也许你会问,无论是404还是200,都会在消息体内给出一个说明网页,那么对于客户端来说二者有什么区别呢?
一个比较明显的区别在于200是成功请求,浏览器会记录下这个地址,以便下次再访问时可以自动提示该地址,而404是失败请求,浏览器只会显示出返回的页面内容,并不会记录此地址,要再次访问时还需要输入完整的地址。
3401AccessDenied
当WEB服务器不允许匿名访问,而我们又没有提供正确的用户名/密码时,服务器就会给出这个返回代码。
在IIS中,设置IIS的安全属性为不允许匿名访问(如下图),此时直接访问的话就会得到以下返回结果:
HTTP/1.1401AccessDenied
Server:
Microsoft-IIS/5.1
Date:
Mon,06Mar200609:
15:
55GMT
WWW-Authenticate:
Negotiate
WWW-Authenticate:
NTLM
Connection:
close
Content-Length:
3964
Content-Type:
text/html
DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML3.2Final//EN">
……
此时浏览器上给出的提示如下图,让我们输入用户名和密码:
因返回信息中消息体较长,只取前面两行内容。
注意,如果是用localhost来访问本机的IIS,因IE可以直接取得当前用户的身份,它会和服务器间直接进行协商,所以不会看到401提示。
当我们在输入了用户名和密码以后,服务器与客户端会再进行两次对话。
首先客户端向服务器索取一个公钥,服务器端会返回一个公钥,二者都用BASE64编码,相应的消息如下(编码部分已经做了处理):
GET/HTTP/1.1
Accept:
image/gif,image/x-xbitmap,image/jpeg,image/pjpeg,application/x-shockwave-flash,application/vnd.ms-excel,application/vnd.ms-powerpoint,application/msword,*/*
Accept-Language:
zh-cn
Accept-Encoding:
gzip,deflate
User-Agent:
Mozilla/4.0(compatible;MSIE6.0;WindowsNT5.1;SV1;.NETCLR1.1.4322;.NETCLR2.0.50727)
Host:
192.168.0.55:
8080
Connection:
Keep-Alive
Authorization:
NegotiateABCDEFG……
HTTP/1.1401AccessDenied
Server:
Microsoft-IIS/5.1
Date:
Mon,06Mar200609:
20:
53GMT
WWW-Authenticate:
NegotiateHIJKLMN……
Content-Length:
3715
Content-Type:
text/html
DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML3.2Final//EN">
……
客户端拿到公钥之后使用公钥对用户名和密码进行加密码,然后把加密以后的结果重新发给服务器:
GET/HTTP/1.1
Accept:
image/gif,image/x-xbitmap,image/jpeg,image/pjpeg,application/x-shockwave-flash,application/vnd.ms-excel,application/vnd.ms-powerpoint,application/msword,*/*
Accept-Language:
zh-cn
Accept-Encoding:
gzip,deflate
User-Agent:
Mozilla/4.0(compatible;MSIE6.0;WindowsNT5.1;SV1;.NETCLR1.1.4322;.NETCLR2.0.50727)
Host:
192.168.0.55:
8080
Connection:
Keep-Alive
Authorization:
NegotiateOPQRST……
这样,如果验证通过,服务器端就会把请求的内容发送过来了,也就是说禁止匿名访问的网站会经过三次请求才可以看到页面。
但因为客户端浏览器已经缓存了公钥,用同一个浏览器窗口再次请求这个网站上的其它页面时就可以直接发送验证信息,从而一次交互就可以完成了。
4302ObjectMoved
用过ASP的人都知道ASP中页面重定向至少有Redirect和Transfer两种方法。
二的区别在于Redirect是客户端重定向,而Transfer是服务器端重定向,那么它们具体是如何通过HTTP消息头实现的呢?
先来看一下Transfer的例子:
例如ASP文件1.asp只有一行
<%Server.Transfer"1.htm"%>
HTML文件1.htm也只有一行:
thisis1.htm
如果我们从浏览器里请求1.asp,发送的请求是:
GET/1.aspHTTP/1.1
Accept:
*/*
Accept-Language:
zh-cn
Accept-Encoding:
gzip,deflate
User-Agent:
Mozilla/4.0(compatible;MSIE6.0;WindowsNT5.1;SV1;.NETCLR1.1.4322;.NETCLR2.0.50727)
Host:
localhost:
8080
Connection:
Keep-Alive
Cookie:
ASPSESSIONIDACCTRTTT=PKKDJOPBAKMAMBNANIPIFDAP
注意请求的文件确实是1.asp,而得到的回应则是:
HTTP/1.1200OK
Server:
Microsoft-IIS/5.1
Date:
Mon,06Mar200612:
52:
44GMT
X-Powered-By:
ASP.NET
Content-Length:
20
Content-Type:
text/html
Cache-control:
private
thisis1.htm
不难看出,通过Server.Transfer语句服务器端已经做了页面重定向,而客户端对此一无所知,表面上看上去得到的就是1.asp的结果。
如果把1.asp的内容改为:
<%Response.Redirect"1.htm"%>
再次请求1.asp,发送的请求没有变化,得到的回应却变成了:
HTTP/1.1302Objectmoved
Server:
Microsoft-IIS/5.1
Date:
Mon,06Mar200612:
55:
57GMT
X-Powered-By:
ASP.NET
Location:
1.htm
Content-Length:
121
Content-Type:
text/html
Cache-control:
private
ObjectMoved
Thisobjectmaybefound注意HTTP的返回代码由200变成了302,表示这是一个重定向消息,客户端需要根据消息头中Location字段的值重新发送请求,于是就有了下面一组对话:
GET/1.htmHTTP/1.1
Accept:
*/*
Accept-Language:
zh-cn
Accept-Encoding:
gzip,deflate
User-Agent:
Mozilla/4.0(compatible;MSIE6.0;WindowsNT5.1;SV1;.NETCLR1.1.4322;.NETCLR2.0.50727)
Host:
localhost:
8080
Connection:
Keep-Alive
If-Modified-Since:
Thu,02Mar200606:
50:
13GMT
If-None-Match:
"b224758ec53dc61:
9f0"
Cookie:
ASPSESSIONIDACCTRTTT=PKKDJOPBAKMAMBNANIPIFDAP
HTTP/1.1200OK
Server:
Microsoft-IIS/5.1
X-Powered-By:
ASP.NET
Date:
Mon,06Mar200612:
55:
57GMT
Content-Type:
text/html
Accept-Ranges:
bytes
Last-Modified:
Mon,06Mar200612:
52:
32GMT
ETag:
"76d85bd51c41c61:
9f0"
Content-Length:
20
thisis1.htm
很明显,两种重定向方式虽然看上去结果很像,但在实现原理上有很大的不同。
5500InternalServerError
500号错误发生在服务器程序有错误的时候,例如,ASP程序为
<%if%>
显然这个程序并不完整,于是得到的结果为:
HTTP/1.1500InternalServerError
Server:
Microsoft-IIS/5.1
Date:
Mon,06Mar200612:
58:
55GMT
X-Powered-By:
ASP.NET
Content-Length:
4301
Content-Type:
text/html
Expires:
Mon,06Mar200612:
58:
55GMT
Set-Cookie:
ASPSESSIONIDACCTRTTT=ALKDJOPBPPKNPCNOEPCNOOPD;path=/
Cache-control:
private
DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML3.2Final//EN">
……
服务器发送了500号错误,并且后面通过HTML的方式说明了错误的原因。
理解HTTP消息头(三)
(三)客户端发送的内容
这一次主要来观察HTTP消息头中客户端的请求,从中找到一些有意思的内容。
1HTTP_REFERER
写两个简单的网页:
a.htm:
b.htm:
haha
内容很简单,就是网页A中有一个到B的链接。
把它们放到IIS上,并访问网页A,从中再点击到B的链接,于是看到了B页的“haha”。
那么这两次请求有什么不同吗?
观察它们所发送的HTTP消息头,最明显的区别就是访问B页时比访问A页时多了一行:
Referer:
http:
//localhost/a.htm
这一行就表示,用户要访问的B页是从A页链接过来的。
服务器端要想取得这个值也是很容易的,以ASP为例,只需要写一句
<%=Request.ServerVariables("HTTP_REFERER")%>
就可以了。
一些网站通过HTTP_REFERER来做安全验证,判断用户是不是从允许的页面链接来的,而不是直接从浏览器上打URL或从其他页面链接过来,这样可以从一定程度上防止网页被做非法使用。
但从上述原理来看,想要骗过服务器也并不困难,只要手工构造输入的HTTP消息头就可以了,其他常用的手段还有通过HOSTS文件伪造域名等。
除了超链接以外,还有其他几种方式会导致HTTP_REFERER信息被发送,如:
内联框架:
框架集:
表单提交:
SCRIPT引用:
CSS引用:
XML数据岛:
而以下形式不会发送HTTP_REFERER:
script转向:
script开新窗口:
META转向:
引入图片:
2COOKIE
COOKIE是大家都非常熟悉的了,通过它可以在客户端保存用户状态,即使用户关闭浏览器也能继续保存。
那么客户端与服务器端是如何交换COOKIE信息的呢?
没错,也是通过HTTP消息头。
首先写一个简单的ASP网页:
<%
Dimi
i= Request.Cookies("key")
Response.Writei
Response.Cookies("key")="haha"
Response.Cookies("key").Expires=#2007-1-1#
%>
第一次访问此网页时,屏幕上一片白,第二次访问时,则会显示出“haha”。
通过阅读程序不难发现,屏幕上显示的内容实际上是COOKIE的内容,而第一次访问时还没有设置COOKIE的值,所以不会有显示,第二次显示的是第一次设置的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 关于 http 文件 文档