`
cczj2008
  • 浏览: 3614 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

(二)理解HTTP消息头

阅读更多
常见的HTTP返回码
上一篇文章里我简要的说了说HTTP消息头的格式,注意到在服务器返回的HTTP消息头里有一个“HTTP/1.1 200 OK”,这里的200是HTTP规定的返回代码,表示请求已经被正常处理完成。浏览器通过这个返回代码就可以知道服务器对所发请求的处理情况是什么,每一种返回代码都有自己的含义。这里列举几种常见的返回码。
1 403 Access Forbidden
如果我们试图请求服务器上一个文件夹,而在WEB服务器上这个文件夹并没有允许对这个文件夹列目录的话,就会返回这个代码。一个完整的403回复可能是这样的:(IIS5.1)
HTTP/1.1 403 Access Forbidden
Server: Microsoft-IIS/5.1
Date: Mon, 06 Mar 2006 08:57:39 GMT
Connection: close
Content-Type: text/html
Content-Length: 172

<html><head><title>Directory Listing Denied</title></head>
<body><h1>Directory Listing Denied</h1>This Virtual Directory does not allow contents to be listed.</body></html>
2 404 Object not found
当我们请求的对象在服务器上并不存在时,就会给出这个返回代码,这可能也是最常见的错误代码了。IIS给出的404消息内容很长,除了消息头以外还有一个完整的说明“为什么会这样”的网页。APACHE服务器的404消息比较简短,如下:
HTTP/1.1 404 Not Found
Date: Mon, 06 Mar 2006 09:03:14 GMT
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

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL /notexist was not found on this server.</p>
<hr>
<address>Apache/2.0.55 (Unix) PHP/5.0.5 Server at localhost Port 8080</address>
</body></html>
也许你会问,无论是404还是200,都会在消息体内给出一个说明网页,那么对于客户端来说二者有什么区别呢?一个比较明显的区别在于200是成功请求,浏览器会记录下这个地址,以便下次再访问时可以自动提示该地址,而404是失败请求,浏览器只会显示出返回的页面内容,并不会记录此地址,要再次访问时还需要输入完整的地址。
3 401 Access Denied
当WEB服务器不允许匿名访问,而我们又没有提供正确的用户名/密码时,服务器就会给出这个返回代码。在IIS中,设置IIS的安全属性为不允许匿名访问(如下图),此时直接访问的话就会得到以下返回结果:

HTTP/1.1 401 Access Denied
Server: Microsoft-IIS/5.1
Date: Mon, 06 Mar 2006 09:15:55 GMT
WWW-Authenticate: Negotiate
WWW-Authenticate: NTLM
Connection: close
Content-Length: 3964
Content-Type: text/html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html dir=ltr>
……
此时浏览器上给出的提示如下图,让我们输入用户名和密码:

因返回信息中消息体较长,只取前面两行内容。注意,如果是用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; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
Host: 192.168.0.55:8080
Connection: Keep-Alive
Authorization: Negotiate ABCDEFG……

HTTP/1.1 401 Access Denied
Server: Microsoft-IIS/5.1
Date: Mon, 06 Mar 2006 09:20:53 GMT
WWW-Authenticate: Negotiate HIJKLMN……
Content-Length: 3715
Content-Type: text/html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html dir=ltr>
……
客户端拿到公钥之后使用公钥对用户名和密码进行加密码,然后把加密以后的结果重新发给服务器:
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; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
Host: 192.168.0.55:8080
Connection: Keep-Alive
Authorization: Negotiate OPQRST……
这样,如果验证通过,服务器端就会把请求的内容发送过来了,也就是说禁止匿名访问的网站会经过三次请求才可以看到页面。但因为客户端浏览器已经缓存了公钥,用同一个浏览器窗口再次请求这个网站上的其它页面时就可以直接发送验证信息,从而一次交互就可以完成了。
4 302 Object Moved
用过ASP的人都知道ASP中页面重定向至少有Redirect和Transfer两种方法。二的区别在于Redirect是客户端重定向,而Transfer是服务器端重定向,那么它们具体是如何通过HTTP消息头实现的呢?
先来看一下Transfer的例子:
例如ASP文件1.asp只有一行
<% Server.Transfer "1.htm" %>
HTML文件1.htm也只有一行:
<p>this is 1.htm</p>
如果我们从浏览器里请求1.asp,发送的请求是:
GET /1.asp HTTP/1.1
Accept: */*
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
Host: localhost:8080
Connection: Keep-Alive
Cookie: ASPSESSIONIDACCTRTTT=PKKDJOPBAKMAMBNANIPIFDAP
注意请求的文件确实是1.asp,而得到的回应则是:
HTTP/1.1 200 OK
Server: Microsoft-IIS/5.1
Date: Mon, 06 Mar 2006 12:52:44 GMT
X-Powered-By: ASP.NET
Content-Length: 20
Content-Type: text/html
Cache-control: private

<p>this is 1.htm</p>
不难看出,通过Server.Transfer语句服务器端已经做了页面重定向,而客户端对此一无所知,表面上看上去得到的就是1.asp的结果。
如果把1.asp的内容改为:
<% Response.Redirect "1.htm" %>
再次请求1.asp,发送的请求没有变化,得到的回应却变成了:
HTTP/1.1 302 Object moved
Server: Microsoft-IIS/5.1
Date: Mon, 06 Mar 2006 12:55:57 GMT
X-Powered-By: ASP.NET
Location: 1.htm
Content-Length: 121
Content-Type: text/html
Cache-control: private

<head><title>Object moved</title></head>
<body><h1>Object Moved</h1>This object may be found <a HREF="">here</a>.</body>
注意HTTP的返回代码由200变成了302,表示这是一个重定向消息,客户端需要根据消息头中Location字段的值重新发送请求,于是就有了下面一组对话:
GET /1.htm HTTP/1.1
Accept: */*
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
Host: localhost:8080
Connection: Keep-Alive
If-Modified-Since: Thu, 02 Mar 2006 06:50:13 GMT
If-None-Match: "b224758ec53dc61:9f0"
Cookie: ASPSESSIONIDACCTRTTT=PKKDJOPBAKMAMBNANIPIFDAP

HTTP/1.1 200 OK
Server: Microsoft-IIS/5.1
X-Powered-By: ASP.NET
Date: Mon, 06 Mar 2006 12:55:57 GMT
Content-Type: text/html
Accept-Ranges: bytes
Last-Modified: Mon, 06 Mar 2006 12:52:32 GMT
ETag: "76d85bd51c41c61:9f0"
Content-Length: 20

<p>this is 1.htm</p>
很明显,两种重定向方式虽然看上去结果很像,但在实现原理上有很大的不同。

5 500 Internal Server Error
500号错误发生在服务器程序有错误的时候,例如,ASP程序为
<% if %>
显然这个程序并不完整,于是得到的结果为:
HTTP/1.1 500 Internal Server Error
Server: Microsoft-IIS/5.1
Date: Mon, 06 Mar 2006 12:58:55 GMT
X-Powered-By: ASP.NET
Content-Length: 4301
Content-Type: text/html
Expires: Mon, 06 Mar 2006 12:58:55 GMT
Set-Cookie: ASPSESSIONIDACCTRTTT=ALKDJOPBPPKNPCNOEPCNOOPD; path=/
Cache-control: private

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html dir=ltr>
……
服务器发送了500号错误,并且后面通过HTML的方式说明了错误的原因。

分享到:
评论

相关推荐

    数据解析和打包 消息体 消息头

    首先,我们要理解“消息体”和“消息头”。在数据传输过程中,一个完整的消息通常由两部分组成:消息头和消息体。消息头包含了关于消息的重要元数据,如发送者、接收者、消息类型、长度等,而消息体则包含了实际的...

    HTTP1.1消息头

    HTTP/1.1 消息头详解 HTTP/1.1 消息头是 HTTP 协议中的一种机制,用于在客户端和...了解 HTTP/1.1 消息头的知识点,可以帮助我们更好地理解 HTTP 协议的工作机制,并且可以更好地实现客户端和服务器之间的数据传输。

    HTTP消息头详解.docx

    ### HTTP消息头详解 ...通过理解这些消息头的意义和作用,可以帮助开发者更有效地管理和控制HTTP通信过程中的各种细节。在实际开发过程中,正确设置和利用HTTP消息头不仅可以提高网络通信的效率,还能提升用户体验。

    mq消息头详细介绍

    MQ消息头,即MQMD(Message Descriptor),是IBM的WebSphere MQ(Message Queuing)系统中每个消息都携带的重要元数据。MQMD包含了一系列字段,用于描述消息的各种属性,帮助MQ系统正确处理和路由消息。以下是对这些...

    实现隐式和显式 SOAP 消息头

    ### 二、隐式SOAP消息头 1. **隐式处理**: 当消息头中的元素被声明为“mustUnderstand”属性为“1”时,这意味着接收方必须理解并处理该头信息。否则,它应该拒绝该消息。 ```xml ...

    Http通过响应头控制浏览器行为

    本主题将深入探讨HTTP通信中的消息头与响应头,以及如何通过它们来控制浏览器行为。我们将以一个简单的示例项目"HttpTest"为背景,分析相关知识点。 一、HTTP消息头与响应头 1. HTTP消息结构:HTTP请求由三部分...

    http头信息详解 对http1.0和http1.1的常用头做出详细解释

    HTTP头信息对于理解HTTP协议的工作原理至关重要。通过掌握通用头、请求头和响应头的使用,开发者可以更有效地管理和优化Web应用程序的性能。了解这些头部字段的功能和用法,可以帮助开发者更好地控制客户端与服务器...

    02HTTP请求头响应头详解1

    总结,HTTP请求头和响应头是HTTP通信中不可或缺的部分,它们提供了关于请求和响应的元信息,帮助客户端和服务器理解彼此的需求和响应。了解并正确使用这些头信息对于构建高效的Web应用程序至关重要。在实际开发中,...

    短消息长消息

    ### 长消息技术解析与应用 #### 长消息定义及背景 在现代通信领域,尤其是基于GSM网络的短消息服务(SMS)中,根据消息内容的...通过对长消息技术的理解和掌握,可以帮助开发者更好地设计和优化基于短信的服务和应用。

    HTTP协议头字段及分析

    ### HTTP协议头字段及分析 #### 一、概述 HTTP(HyperText Transfer Protocol)作为互联网上应用最为广泛的一种网络协议,主要用于规定客户端与服务器之间如何通信。它是一种基于请求与响应模型的应用层协议,用于...

    Go-MQ-消息队列代理支持http2

    首先,让我们理解消息队列的基本概念。消息队列是一种异步通信机制,允许生产者(发送方)将消息放入队列,而消费者(接收方)在准备好处理这些消息时再从队列中取出。这种模式可以降低系统的实时性要求,提高系统的...

    Java向苹果服务器推送消息(Java实现HTTP/2协议发送APNS)

    在HTTP/2之前,APNs使用HTTP/1.1和二进制协议,而现在HTTP/2提供了更高效、更低延迟的通信方式,支持多路复用,减少了连接建立的开销。 要使用Java实现APNs推送,你需要以下组件: 1. **证书和密钥**:首先,你...

    HTTP协议的Header头信息详解.txt

    #### 二、Header头信息概述 HTTP的Header头信息类似于我们日常生活中的邮寄包裹,它包含了诸如发件人、收件人、地址等必要信息。在HTTP协议中,这些信息被称为“Header头信息”,它们用于提供关于请求或响应的消息...

    CListCtr多表头的实现方法

    总结起来,实现`CListCtrl`的多表头功能需要对MFC控件有深入的理解,包括控件的创建、消息处理、自定义布局和排序算法。通过创建一个扩展的`CHeaderCtrlEx`类,我们可以实现复杂的需求,提供更加灵活和直观的用户...

    深入理解LTE-A

    - 在无数据传输时,UE可进入空闲态(RRC_IDLE),周期性接收寻呼消息以检查是否有新的呼叫请求或系统信息更新。 - **上行传输流程**: - UE在随机接入过程中可能需要发送前导(preamble)和Msg3。 - eNodeB通过上行...

    JAVA消息服务实例

    3. 消息属性:消息可以携带额外的属性,如用户头(headers)、属性(properties)和消息体(payload)。 4. 持久性:JMS提供了消息持久化的功能,即使在消息代理重启后,未消费的消息也能保留,保证了消息不会丢失...

    HTTP协议详解 培训资料(PPT)

    HTTP消息头用于提供附加信息,如Accept表示客户端接受的数据类型,User-Agent表明发出请求的浏览器类型,Cookie用于保持会话状态,Cache-Control控制缓存策略。实体内容通常是网页HTML、图像或其他资源的二进制数据...

    list 多行表头

    总之,实现“list 多行表头”需要对Windows API和MFC有深入的理解,通过自定义绘图和处理消息,可以创造出具有高级功能的列表控件,提升用户体验。尽管这需要一些额外的工作,但对于创建专业且用户友好的应用来说,...

    Linux消息队列分析及应用

    通过对内核中相关代码的深入分析,我们可以更好地理解消息队列的工作原理,并在实际开发中有效地利用这一强大的IPC工具。无论是处理并发请求还是实现分布式系统中的通信,消息队列都是值得深入研究和掌握的关键技术...

Global site tag (gtag.js) - Google Analytics