Http详解

目录

一、Http头域

二、Http Status-Code 含义

三、缓存控制

一、Http头域

HTTP(HyperTextTransferProtocol)是超文本传输协议的缩写,它用于传送WWW方式的数据,关于HTTP协议的详细内容请参考RFC2616。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求,请求头包含请求的方法、URI、协议版本、以及包含请求修饰符、客户信息和内容的类似于MIME的消息结构。服务器以一个状态行作为响应,相应的内容包括消息协议的版本,成功或者错误编码加上包含服务器信息、实体元信息以及可能的实体内容。

通常HTTP消息包括客户机向服务器的请求消息和服务器向客户机的响应消息。这两种类型的消息由一个起始行,一个或者多个头域,一个只是头域结束的空行和可选的消息体组成。HTTP的头域包括通用头,请求头,响应头和实体头四个部分。每个头域由一个域名,冒号(:)和域值三部分组成。域名是大小写无关的,域值前可以添加任何数量的空格符,头域可以被扩展为多行,在每行开始处,使用至少一个空格或制表符。

 

1、通用头域

通用头域包含请求和响应消息都支持的头域,通用头域包含Cache-Control、Connection、Date、Pragma、Transfer-Encoding、Upgrade、Via。对通用头域的扩展要求通讯双方都支持此扩展,如果存在不支持的通用头域,一般将会作为实体头域处理。下面简单介绍几个在UPnP消息中使用的通用头域。

 

Cache-Control头域

Cache-Control指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置Cache-Control并不会修改另一个消息处理过程中的缓存处理过程。请求时的缓存指令包括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。各个消息中的指令含义如下:

Public 指示响应可被任何缓存区缓存。

Private 指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效。

no-cache 指示请求或响应消息不能缓存

no-store 用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。

max-age 指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。

min-fresh 指示客户机可以接收响应时间小于当前时间加上指定时间的响应。

max-stale 指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。

Date头域

Date头域表示消息发送的时间,时间的描述格式由rfc822定义。例如,Date:Mon,31Dec200104:25:57GMT。Date描述的时间表示世界标准时,换算成本地时间,需要知道用户所在的时区。

Pragma头域

Pragma头域用来包含实现特定的指令,最常用的是Pragma:no-cache。在HTTP/1.1协议中,它的含义和Cache-Control:no-cache相同。

 

2、请求消息

请求消息的第一行为下面的格式:

Method SP Request-URI SP HTTP-Version CRLF

Method 表示对于Request-URI完成的方法,这个字段是大小写敏感的,包括OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE。方法GET和HEAD应该被所有的通用WEB服务器支持,其他所有方法的实现是可选的。GET方法取回由Request-URI标识的信息。HEAD方法也是取回由Request-URI标识的信息,只是可以在响应时,不返回消息体。POST方法可以请求服务器接收包含在请求中的实体信息,可以用于提交表单,向新闻组、BBS、邮件群组和数据库发送消息。

SP 表示空格。

Request-URI 遵循URI格式,在此字段为星号(*)时,说明请求并不用于某个特定的资源地址,而是用于服务器本身。

HTTP-Version 表示支持的HTTP版本,例如为HTTP/1.1。

CRLF 表示换行回车符。

请求头域允许客户端向服务器传递关于请求或者关于客户机的附加信息。请求头域可能包含下列字段Accept、Accept-Charset、Accept- Encoding、Accept-Language、Authorization、From、Host、If-Modified-Since、If- Match、If-None-Match、If-Range、If-Range、If-Unmodified-Since、Max-Forwards、 Proxy-Authorization、Range、Referer、User-Agent。对请求头域的扩展要求通讯双方都支持,如果存在不支持的请求头域,一般将会作为实体头域处理。

 

例如:

GET / HTTP/1.1 Host: www.qq.com Connection: keep-alive Cache-Control: max-age=0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36 Accept-Encoding: gzip,deflate,sdch Accept-Language: zh-CN,en-US;q=0.8,en;q=0.6 Cookie: luin=o0413572281; lskey=00010000b2e79296046c3c8b72a4cd53ba4a89ac6d32e0d2d54241e59370e6bdfa103b6dab683ea7e393032d; ptcz=ca880e7ab8a07cf8d11379834c8412fa2a12bb597cb6489dbcd501c8f12938d6; pt2gguin=o0413572281; ptisp=cnc; speedup=sdch; ts_last=/; pgv_pvid=5067154695; o_cookie=413572281; pgv_info=ssid=s5945613547; ts_uid=8031254671; ts_sid=9514512128

 

 

 

Host头域

 

Host头域指定请求资源的Intenet主机和端口号,必须表示请求url的原始服务器或网关的位置。HTTP/1.1请求必须包含主机头域,否则系统会以400状态码返回。

Referer头域

Referer头域允许客户端指定请求uri的源资源地址,这可以允许服务器生成回退链表,可用来登陆、优化cache等。他也允许废除的或错误的连接由于维护的目的被追踪。如果请求的uri没有自己的uri地址,Referer不能被发送。如果指定的是部分uri地址,则此地址应该是一个相对地址。

Range头域

Range头域可以请求实体的一个或者多个子范围。例如,

表示头500个字节:bytes=0-499

表示第二个500字节:bytes=500-999

表示最后500个字节:bytes=-500

表示500字节以后的范围:bytes=500-

第一个和最后一个字节:bytes=0-0,-1

同时指定几个范围:bytes=500-600,601-999

但是服务器可以忽略此请求头,如果无条件GET包含Range请求头,响应会以状态码206(PartialContent)返回而不是以200(OK)。

User-Agent头域

User-Agent头域的内容包含发出请求的用户信息。

 

3、响应消息

响应消息的第一行为下面的格式:

HTTP-Version SP Status-Code SP Reason-Phrase CRLF

HTTP-Version 表示支持的HTTP版本,例如为HTTP/1.1。

Status-Code 是一个三个数字的结果代码。

Reason-Phrase 给Status-Code提供一个简单的文本描述。Status-Code主要用于机器自动识别,Reason-Phrase主要用于帮助用户理解。Status-Code的第一个数字定义响应的类别,后两个数字没有分类的作用。第一个数字可能取5个不同的值:

响应头域允许服务器传递不能放在状态行的附加信息,这些域主要描述服务器的信息和Request-URI进一步的信息。响应头域包含Age、 Location、Proxy-Authenticate、Public、Retry-After、Server、Vary、Warning、WWW- Authenticate。对响应头域的扩展要求通讯双方都支持,如果存在不支持的响应头域,一般将会作为实体头域处理。

Location响应头 

Location响应头用于重定向接收者到一个新URI地址。

Server响应头 

Server响应头包含处理请求的原始服务器的软件信息。此域能包含多个产品标识和注释,产品标识一般按照重要性排序。

例如:

HTTP/1.1 200 OK

Server: squid/3.1.18

Date: Wed, 21 Aug 2013 03:10:15 GMT

Content-Type: text/html; charset=GB2312

Transfer-Encoding: chunked

Connection: keep-alive

Vary: Accept-Encoding

Expires: Wed, 21 Aug 2013 03:25:15 GMT

Cache-Control: max-age=900

Vary: Accept-Encoding

Content-Encoding: gzip

X-Cache: HIT from shenzhen.qq.com

 

 

4、实体信息

请求消息和响应消息都可以包含实体信息,实体信息一般由实体头域和实体组成。实体头域包含关于实体的原信息,实体头包括Allow、Content-Base、Content-Encoding、Content-Language、 Content-Length、Content-Location、Content-MD5、Content-Range、Content-Type、 Etag、Expires、Last-Modified、extension-header。extension-header允许客户端定义新的实体头,但是这些域可能无法未接受方识别。实体可以是一个经过编码的字节流,它的编码方式由Content-Encoding或Content-Type定义,它的长度由Content-Length或Content-Range定义。

Content-Type实体头

Content-Type 实体头用于向接收方指示实体的介质类型,指定HEAD方法送到接收方的实体介质类型,或GET方法发送的请求介质类型Content-Range实体头

Content-Range实体头

用于指定整个实体中的一部分的插入位置,他也指示了整个实体的长度。在服务器向客户返回一个部分响应,它必须描述响应覆盖的范围和整个实体长度。一般格式:

Content-Range:bytes-unit SP first-byte-pos - last-byte-pos/entity-legth

例如,传送头500个字节次字段的形式:Content-Range:bytes0-499/1234如果一个http消息包含此节(例如,对范围请求的响应或对一系列范围的重叠请求),Content-Range表示传送的范围,Content-Length表示实际传送的字节数。

Last-modified实体头

Last-modified实体头指定服务器上保存内容的最后修订时间。

 

 

 

 

 

 

 

 

 

上述4个部分

General Header Fields

=============================

general header是request、response都可用的, 但是不能用于entity.

-- Cache-Control

-- Connection

-- Date

-- Pragma

-- Trailer

-- Transfer-Encoding

-- Upgrade

-- Via

-- Warning

*******************************************************************************

Request Header Fields

======================

request-header fields 允许客户端传递关于request和客户端的附加信息到服务端,

-- Accept

-- Accept-Charset

-- Accept-Encoding

-- Accept-Language

-- Authorization

-- Expect

-- From

-- Host

-- If-Match

-- If-Modified-Since

-- If-None-Match

-- If-Range

-- If-Unmodified-Since

-- Max-Forwards

-- Proxy-Authorization

-- Range

-- Referer

-- TE

-- User-Agent

*******************************************************************************

Response Header Fields

===============================

response-header fields 允许服务端传递关于response的、不能放到Status-Line的附加信息。

这些头给出关于服务端的信息。

-- Accept-Ranges

-- Age

-- ETag

-- Location

-- Proxy-Authenticate

-- Retry-After

-- Server

-- Vary

-- WWW-Authenticate

*******************************************************************************

Entity Header Fields

========================

Entity-header fields 定义关于entity-body的metainformation(标题字段数据),

如果当前没有body, 则定义被request确定的资源信息.

一些metainformation是可选的; 一些是必须的。

-- Allow

-- Content-Encoding

-- Content-Language

-- Content-Length

-- Content-Location

-- Content-MD5

-- Content-Range

-- Content-Type

-- Expires

-- Last-Modified

-- extension-header

 

 

有关HTTP头完整、详细的说明,请参见http://www.w3.org/Protocols/的HTTP规范。

二、Http Status-Code 含义

 

1xx - 信息提示

这些状态代码表示临时的响应。客户端在收到常规响应之前,应准备接收一个或多个 •   • 1xx 响应。

• 100 - 继续。

• 101 - 切换协议。

 

 

 

2xx - 成功

这类状态代码表明服务器成功地接受了客户端请求。 • 200 - 确定。客户端请求已成功。

• 201 - 已创建。

• 202 - 已接受。

• 203 - 非权威性信息。

• 204 - 无内容。

• 205 - 重置内容。

• 206 - 部分内容。

 

 

3xx - 重定向

 

客户端浏览器必须采取更多操作来实现请求。例如,浏览器可能不得不请求服务器上的不同的页面,或通过代理服务器重复该请求。

• 301 - 被请求的资源已永久移动到新位置

• 302 - 对象已移动。

• 304 - 未修改。

• 307 - 临时重定向。

 

 

4xx - 客户端错误

发生错误,客户端似乎有问题。例如,客户端请求不存在的页面,客户端未提供有效的身份验证信息。

• 400 - 错误的请求。

• 401 - 访问被拒绝。IIS 定义了许多不同的 401 错误,它们指明更为具体的错误原因。这些具体的错误代码在浏览器中显示,但不在 IIS 日志中显示: • 401.1 - 登录失败。

• 401.2 - 服务器配置导致登录失败。

• 401.3 - 由于 ACL 对资源的限制而未获得授权。

• 401.4 - 筛选器授权失败。

• 401.5 - ISAPI/CGI 应用程序授权失败。

• 401.7 – 访问被 Web 服务器上的 URL 授权策略拒绝。这个错误代码为 IIS 6.0 所专用。

 

• 403 - 禁止访问:IIS 定义了许多不同的 403 错误,它们指明更为具体的错误原因:  • 403.1 - 执行访问被禁止。

• 403.2 - 读访问被禁止。

• 403.3 - 写访问被禁止。

• 403.4 - 要求 SSL。

• 403.5 - 要求 SSL 128。

• 403.6 - IP 地址被拒绝。

• 403.7 - 要求客户端证书。

• 403.8 - 站点访问被拒绝。

• 403.9 - 用户数过多。

• 403.10 - 配置无效。

• 403.11 - 密码更改。

• 403.12 - 拒绝访问映射表。

• 403.13 - 客户端证书被吊销。

• 403.14 - 拒绝目录列表。

• 403.15 - 超出客户端访问许可。

• 403.16 - 客户端证书不受信任或无效。

• 403.17 - 客户端证书已过期或尚未生效。

• 403.18 - 在当前的应用程序池中不能执行所请求的 URL。这个错误代码为 IIS 6.0 所专用。

• 403.19 - 不能为这个应用程序池中的客户端执行 CGI。这个错误代码为 IIS 6.0 所专用。

• 403.20 - Passport 登录失败。这个错误代码为 IIS 6.0 所专用。

• 404 - 未找到。 • 404.0 -(无) – 没有找到文件或目录。

• 404.1 - 无法在所请求的端口上访问 Web 站点。

• 404.2 - Web 服务扩展锁定策略阻止本请求。

• 404.3 - MIME 映射策略阻止本请求。

• 405 - 用来访问本页面的 HTTP 谓词不被允许(方法不被允许)

• 406 - 客户端浏览器不接受所请求页面的 MIME 类型。

• 407 - 要求进行代理身份验证。

• 412 - 前提条件失败。

• 413 – 请求实体太大。

• 414 - 请求 URI 太长。

• 415 – 不支持的媒体类型。

• 416 – 所请求的范围无法满足。

• 417 – 执行失败。

• 423 – 锁定的错误。

 

 

5xx - 服务器错误

服务器由于遇到错误而不能完成该请求。 • 500 - 内部服务器错误。 • 500.12 - 应用程序正忙于在 Web 服务器上重新启动。

• 500.13 - Web 服务器太忙。

• 500.15 - 不允许直接请求 Global.asa。

• 500.16 – UNC 授权凭据不正确。这个错误代码为 IIS 6.0 所专用。

• 500.18 – URL 授权存储不能打开。这个错误代码为 IIS 6.0 所专用。

• 500.100 - 内部 ASP 错误。

 

• 501 - 页眉值指定了未实现的配置。

• 502 - Web 服务器用作网关或代理服务器时收到了无效响应。 • 502.1 - CGI 应用程序超时。

• 502.2 - CGI 应用程序出错。application.

 

• 503 - 服务不可用。这个错误代码为 IIS 6.0 所专用。

• 504 - 网关超时。

• 505 - HTTP 版本不受支持。

 

三、缓存控制

 

1. Expires(过期时间)

Expires属性是告诉缓存器缓存在多长时间内是有效的。过了该时间,缓存器就会向源服务器发送请求,检查文档是否被修 改。几乎所有的缓存服务器都支持Expires属性;

Web服务器设置Expires属性的方法有:

绝对时间间隔:基于客户最后查看副本的时间(最后访问时间)

根据服务器上文档最后被修改的时间

适用范围:

对于设置静态图片文件(例如导航栏和图片按钮)可缓存特别有用;因为这些图片修改很少,你可以给它们设置一个特别长的过期时间,这会使你的网站对 用户变得相应非常快;

对于控制有规律改变的网页也很有用。例如:你每天早上6点更新新闻页,你可以设置副本的过期时间也是这个时间,这样缓存 服务器就知道什么时候去取一个更新版本,而不必让用户去按浏览器的“刷新”按钮。

时间格式:

只能是HTTP格式的日期时间,其他的都会被解析成当前时间“之前”,副本会过期,记住:HTTP的日期时间必须是格林威治时 间(GMT),而不是本地时间。举例:Expires: Fri, 30 Oct 1998 14:19:41

注意:

确认你的Web服务器时间设置正确。

Web服务器的时间和缓存服务器的时间必须是同步的,如果不同步, 要么是应该缓存的内容提前过期了,要么是过期结果没及时更新。

如果设置的过期时间是一个固定的时间,如果返回内容的时候又没有连带更新下次过期的时间,那么之后所有访问请求都会被发送给源Web服务器,反而增加了负载和响应时间;

 

2. Cache-Control(缓存控制)

 

有用的 Cache-Control响应头信息包括:

max-age=n  单位是秒:从请求时间开始到过期时间之间的秒数,是相对时间间隔,而不是绝对过期时间;

s-maxage=n  类似于max-age属性,除了他应用于共享(如:代理服务器)缓存;

public  标记认证内容也可以被缓存,经过HTTP认证才能访问的内容,输出是自动不可以缓存的;

no-cache  强制每次请求直接发送给源服务器,而不经过本地缓存版本的校验;

no-store  强制缓存在任何情况下都不要保留任何副本

must-revalidate  告诉缓存必须遵循所有你给予副本的新鲜度的,HTTP允许缓存在某些特定情况下返回过期数据;

proxy-revalidate和must-revalidate类似,除了他只对缓存代理服务器起作用

举例:
Cache-Control: max-age=3600, must-revalidate

注意:

给静态资源(HTML文件,图片文件等)的Repsone加上Expires/Cache-Control Header是很有效的一招。Expires的值只能是一个固定日期,比如“Thu 27 Nov 2008 07:00:00 GMT”,不能是一个类似“从现在开始之后10年”这样一个随机浮动的值,如果要这样的效果,可以用Cache-Control这样的Header,如果 HTTP Resposne中有这样的Header:“Cache-Control: max-age = 100”,表示这个资源在cache中的最大寿命是100秒。一般说来这种静态文件永远不应该过期,如果真的要给这个Cache加上一个期限,那我希望是 ——一万年,“Cache-Control: max-age = 315360000000”

其实就应该给Expires设一个永远不会过期的时间,比如你现在有一个文件叫logo.gif,需要用一个新的logo的时候,你不要去 覆盖原来的文件,而把新的logo存成logo_v2.gif,让相关网页引用新的logo_v2.gif,这样可以让新老网页同时工作,实在犯不上为了 节省存储空间覆盖原有文件。

配置:

对Apache服务器,使用mod_expires,在httpd.conf或者.htaccess中加上“\\.(ico|gif|jpg|html)$”>ExpiresDefault “access plus 10 years”

3.Last-Modified/If-Modified-Since

所有现代的浏览器都支持最近修改 (last-modified) 的数据检查。如果你曾经访问过某页,一天后重新访问相同的页时发现它没有变化,并奇怪第二次访问时页面加载得如此之快——这就是原因所在。你的浏览器首次 访问时会在本地缓存页面内容,当你第二次访问,浏览器自动发送首次访问时从服务器获得的最近修改日期。服务器简单地返回 304: Not Modified (没有修改),因此浏览器就会知道从本地缓存加载页面。

4. ETag/If-None-Match

ETag 是实现与最近修改数据检查同样的功能的另一种方法:没有变化时不重新下载数据。其工作方式是:服务器发送你所请求的数据的同时,发送某种数据的 hash (在 ETag 头信息中给出)。hash 的确定完全取决于服务器。当第二次请求相同的数据时,你需要在 If-None-Match: 头信息中包含 ETag hash,如果数据没有改变,服务器将返回 304 状态代码。与最近修改数据检查相同,服务器仅仅 发送 304 状态代码;第二次将不为你发送相同的数据。在第二次请求时,通过包含 ETag hash,你告诉服务器:如果 hash 仍旧匹配就没有必要重新发送相同的数据,因为你还有上一次访问过的数据。

Tags:

发表评论