HTTP请求具体解释
阅读原文时间:2023年07月14日阅读:1

做过Socket编程的人都知道,当我们设计一个通信协议时,“消息头/消息体”的切割方式是非经常常使用的。消息头告诉对方这个消息是干什么的,消息体告诉对方怎么干。

HTTP协议传输的消息也是这样规定的。每个HTTP包都分为HTTP头和HTTP体两部分,消息体是可选的,而消息头是必须的。每当我们打开一个网页,在上面点击右键,选择“查看源文件”,这时看到的HTML代码就是HTTP的消息体。那么消息头能够通过浏览器的开发工具或者插件能够看到,假设火狐的Firebug。IE的Httpwatch。

client通过发送 HTTP 请求向server请求对资源的訪问。 它向server传递了一个数据块。也就是请求信息,HTTP 请求由三部分组成:请求行、  请求头和请求正文。

请求行:请求方法 URI 协议/版本号

请求头(Request Header)

请求正文

以下是一个HTTP请求的数据:

POST /index.php HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:10.0.2) Gecko/20100101 Firefox/10.0.2
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Referer: http://localhost/
Content-Length:25
Content-Type:application/x-www-form-urlencoded
 
username=aa&password=1234

1、请求行:请求方法URI协议/版本号

 请求的第一行是“方法 URL  协议/版本号”,并以 回车换行作为结尾。

请求行以空格分隔。格式例如以下:

POST /index.php HTTP/1.1

以上代码中“GET”代表请求方法,“//ndex.php”表示URI。“HTTP/1.1代表协议和协议的版本号。

        依据HTTP标准,HTTP请求能够使用多种请求方法。

比如:HTTP1.1支持7种请求方法:GET、POST、HEAD、OPTIONS、PUT、DELETE和TARCE。

在Internet应用中,最经常使用的方法是GET和POST。

         URL完整地指定了要訪问的网络资源,通常仅仅要给出相对于server的根文件夹的相对文件夹就可以,因此总是以“/”开头,最后,协议版本号声明了通信过程中使用HTTP的版本号。   

请求方法

在 HTTP 协议中,HTTP 请求能够使用多种请求方法。这些方法指明了要以何种方式来訪问 Request-URI 所标识的资源。HTTP1.1 支持的请求方法例如以下表所看到的:

HTTP1.1 中的请求方式:

方法

作用

GET

请求获取由 Request-URI 所标识的资源

POST

请求server接收在请求中封装的实体。并将其作为由 Request-Line 中的 Request-URI 所标识的资源的一部分

HEAD

请求获取由 Request-URI 所标识的资源的响应消息报头

PUT

请求server存储一个资源,并用 Request-URI 作为其标识符

DELETE

请求server删除由 Request-URI 所标识的资源

TRACE

请求server回送到的请求信息,主要用于測试或诊断

CONNECT

保留将来使用

OPTIONS

请求查询server的性能。或者查询与资源相关的选项和需求

重点介绍 GET、POST 和 HEAD 三个方法:

(1)GET

GET 方法用于获取由 Request-URI 所标识的资源的信息,常见的形式是:

GET Request-URI HTTP/1.1

        GET方法是默认的HTTP请求方法,比如当我们通过在浏览器的地址栏中直接输入网址的方式去訪问网页的时候,浏览器採用的就是 GET 方法向server获取资源。

我们能够使用GET方法来提交表单数据,用GET方法提交的表单数据仅仅经过了简单的编码,同一时候它将作为URL的一部分向server发送,因此。假设使用GET方法来提交表单数据就存在着安全隐患上。比如:

         Http://localhost/login.php?

username=aa&password=1234

从上面的URL请求中,非常easy就能够辩认出表单提交的内容。

(?之后的内容)另外由于GET方法提交的数据是作为URL请求的一部分所以提交的数据量不能太大。

这是由于浏览器对url的长度有限制

各种浏览器也会对url的长度有所限制。以下是几种常见浏览器的url长度限制:(单位:字符)

IE : 2803

Firefox:65536

Chrome:8182

Safari:80000

Opera:190000 

(2)POST

POST方法是GET方法的一个替代方法。它主要是向Webserver提交表单数据,尤其是大批量的数据。 在请求头信息结束之后的两个回车换行之后(实际是空一行),就是表单提交的数据。如上面提到的post表单数据:

username=aa&password=1234

POST方法克服了GET方法的一些缺点。

通过POST方法提交表单数据时,数据不是作为URL请求的一部分而是作为标准数据传送给Webserver。这就克服了GET方法中的信息无法保密和数据量太小的缺点。因此,出于安全的考虑以及对用户隐私的尊重。通常表单提交时採用POST方法。

  从编程的角度来讲,假设用户通过GET方法提交数据,则数据存放在QUERY_STRING环境变量中,而POST方法提交的数据则能够从标准输入流中获取。

GET与POST方法有下面差别:

1、  在client,Get方式在通过URL提交数据,数据在URL中能够看到;POST方式。数据放在HTTP包的body中。

2、 GET方式提交的数据大小有限制(由于浏览器对URL的长度有限制),而POST则没有此限制。

3、安全性问题。正如在(1)中提到,使用 Get 的时候。參数会显示在地址栏上。而 Post 不会。所以。假设这些数据是中文数据并且是非敏感数据,那么使用 get。假设用户输入的数据不是中文字符并且包括敏感数据。那么还是使用 post为好。

4.、server取值方式不一样。GET方式取值,如php能够使用$_GET来取得变量的值,而POST方式通过$_POST来获取变量的值。

(3)HEAD

HEAD 方法与 GET 方法差点儿是同样的,它们的差别在于 HEAD 方法仅仅是请求消息报头,而不是完整的内容。对于 HEAD 请求的回应部分来说,它的 HTTP 头部中包括的信息与通过 GET 请求所得到的信息是同样的。

利用这种方法,不必传输整个资源内容。就能够得到 Request-URI 所标识的资源的信息。这种方法通常被用于測试超链接的有效性。能否够訪问,以及近期是否更新。

要注意的是。在 HTML 文档中,书写 get 和 post,大写和小写都能够,但在 HTTP 协议中的 GET 和 POST 仅仅能是大写形式。

2. 请求头

每一个头域由一个域名。冒号(:)和域值三部分组成。域名是大写和小写无关的,域值前能够加入不论什么数量的空格符,头域能够被扩展为多行,在每行開始处,使用至少一个空格或制表符。

HTTP最常见的请求头例如以下:

Transport 头域

Connection:

作用:表示是否须要持久连接。

假设server看到这里的值为“Keep-Alive”。或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接),它就能够利用持久连接的长处,当页面包括多个元素时(比如Applet。图片)。显著地降低下载所须要的时间。要实现这一点,server须要在应答中发送一个Content-Length头。最简单的实现方法是:先把内容写入
ByteArrayOutputStream,然后在正式写出内容之前计算它的大小;

比如: Connection: keep-alive   当一个网页打开完毕后,client和server之间用于传输HTTP数据的TCP连接不会关闭。假设client再次訪问这个server上的  网页,会继续使用这一条已经建立的连接

比如:  Connection: close  代表一个Request完毕后,client和server之间用于传输HTTP数据的TCP连接会关闭,  当client再次发送Request,须要又一次建立TCP连接。

Host(发送请求时,该报头域是必需的)

Host请求报头域主要用于指定被请求资源的Internet主机和port号,它通常从HTTP URL中提取出来的。

eg:http://。localhost/index.html

浏览器发送的请求消息中,就会包括Host请求报头域。例如以下:

Host:localhost

此处使用缺省port号80,若指定了port号8080,则变成:Host:localhost:8080

Client 头域

Accept:

作用:浏览器能够接受的媒体类型(MIME类型),

比如:  Accept: text/html  代表浏览器能够接受server回发的类型为 text/html  也就是我们常说的html文档, 假设server无法返回text/html类型的数据,server应该返回一个406错误(non acceptable)。

通配符 * 代表随意类型。比如  Accept: */*  代表浏览器能够处理全部类型,(一般浏览器发给server都是发这个)

Accept-Encoding:

作用: 浏览器申明自己接收的编码方法。通常指定压缩方法,是否支持压缩。支持什么压缩方法(gzip,deflate),(注意:这不是仅仅字符编码);

比如: Accept-Encoding: gzip, deflate。Server可以向支持gzip/deflate的浏览器返回经gzip或者deflate编码的HTML页面。 很多情形下这可以降低5到10倍的下载时间,也节省带宽。

Accept-Language:

作用: 浏览器申明自己接收的语言。

语言跟字符集的差别:中文是语言,中文有多种字符集,比方big5,gb2312,gbk等等;

比如: Accept-Language:zh-cn 。假设请求消息中没有设置这个报头域,server假定client对各种语言都能够接受。

User-Agent:

作用:告诉HTTPserver。 client使用的操作系统和浏览器的名称和版本号.

我们上网登陆论坛的时候,往往会看到一些欢迎信息,当中列出了你的操作系统的名称和版本号。你所使用的浏览器的名称和版本号,这往往让非常多人感到非常奇妙,实际上, server应用程序就是从User-Agent这个请求报头域中获取到这些信息User-Agent请求报头域同意client将它的操作系统、浏览器和其他属性告诉server。

比如: User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; CIBA; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; InfoPath.2; .NET4.0E)

Accept-Charset:

作用:浏览器申明自己接收的字符集,这就是本文前面介绍的各种字符集和字符编码。如gb2312,utf-8(通常我们说Charset包含了对应的字符编码方案);

比如:Accept-Charset:iso-8859-1,gb2312.假设在请求消息中没有设置这个域,缺省是不论什么字符集都能够接受。

Authorization:授权信息。通常出如今对server发送的WWW-Authenticate头的应答中;

Authorization请求报头域主要用于证明client有权查看某个资源。当浏览器訪问一个页面时,假设收到server的响应代码为401(未授权)。能够发送一个包含Authorization请求报头域的请求,要求server对其进行验证。

Cookie/Login 头域

Cookie:

作用: 最重要的header, 将cookie的值发送给HTTP server

Entity头域

Content-Length

作用:发送给HTTPserver数据的长度。

即请求消息正文的长度。

比如: Content-Length: 38

Content-Type:

作用:

比如:Content-Type: application/x-www-form-urlencoded

Miscellaneous 头域

Referer:

作用: 提供了Request的上下文信息的server,告诉server我是从哪个链接过来的。比方从我主页上链接到一个朋友那里, 他的server就行从HTTP Referer中统计出每天有多少用户点击我主页上的链接訪问    他的站点。

比如: Referer:http://translate.google.cn/?hl=zh-cn&tab=wT

Cache 头域

If-Modified-Since:

作用: 把浏览器端缓存页面的最后改动时间发送到server去。server会把这个时间与server上实际文件的最后改动时间进行对照。假设时间一致,那么返回304,client就直接使用本地缓存文件。假设时间不一致。就会返回200和新的文件内容。client接到之后。会丢弃旧文件,把新文件缓存起来,并显示在浏览器中。

比如:If-Modified-Since: Thu, 09 Feb 2012 09:07:57 GMT。

If-None-Match:

作用: If-None-Match和ETag一起工作。工作原理是在HTTP Response中加入ETag信息。 当用户再次请求该资源时,将在HTTP Request 中加入If-None-Match信息(ETag的值)。

假设server验证资源的ETag没有改变(该资源没有更新),将返回一个304状态告诉client使用本地缓存文件。否则将返回200状态和新的资源和Etag.  使用这种机制将提高站点的性能

比如: If-None-Match: "03f2b33c0bfcc1:0"

Pragma:

作用: 防止页面被缓存, 在HTTP/1.1版本号中。它和Cache-Control:no-cache作用一模一样

Pargma仅仅有一个使用方法, 比如: Pragma: no-cache

注意: 在HTTP/1.0版本号中。仅仅实现了Pragema:no-cache, 没有实现Cache-Control

Cache-Control:

作用: 这个是很重要的规则。 这个用来指定Response-Request遵循的缓存机制。各个指令含义例如以下

Cache-Control:Public   能够被不论什么缓存所缓存()

Cache-Control:Private     内容仅仅缓存到私有缓存中

Cache-Control:no-cache  全部内容都不会被缓存

在接收和解释请求消息后,server会返回一个 HTTP 响应消息。与 HTTP 请求类似,HTTP 响应也是由三个部分组成,各自是:状态行、消息报头和响应正文。

如:

HTTP/1.1 200 OK Date: Sun, 17 Mar 2013 08:12:54 GMT Server: Apache/2.2.8 (Win32) PHP/5.2.5 X-Powered-By: PHP/5.2.5 Set-Cookie: PHPSESSID=c0huq7pdkmm5gg6osoe3mgjmm3; path=/ Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache Content-Length: 4393 Keep-Alive: timeout=5, max=100 Connection: Keep-Alive Content-Type: text/html; charset=utf-8

HTTP响应演示样例<title> </head> <body> Hello HTTP! </body> </html></p> <p> </p> <h3 id="1、状态行">1、状态行</h3> <p>状态行由协议版本号、数字形式的状态代码,及对应的状态描写叙述组成,各元素之间以空格分隔,结尾时回车换行符,格式例如以下:</p> <p>HTTP-Version Status-Code Reason-Phrase CRLF</p> <p>HTTP-Version 表示server HTTP 协议的版本号,Status-Code 表示server发回的响应代码,Reason-Phrase 表示状态代码的文本描写叙述。CRLF 表示回车换行。比如:</p> <p>HTTP/1.1 200 OK (CRLF)</p> <p><strong>状态代码与状态描写叙述</strong></p> <p>状态代码由 3 位数字组成, 表示请求是否被理解或被满足。状态描写叙述给出了关于状态码的简短的文字描写叙述。状态码的第一个数字定义了响应类别,后面两位数字没有详细分类。</p> <p>第一个数字有 5 种取值,例如以下所看到的。</p> <ul> <li>1xx:指示信息——表示请求已经接受,继续处理</li> <li>2xx:成功——表示请求已经被成功接收、理解、接受。</li> <li>3xx:重定向——要完毕请求必须进行更进一步的操作</li> <li>4xx:client错误——请求有语法错误或请求无法实现</li> <li>5xx:server端错误——server未能实现合法的请求。</li> </ul> <p>常见状态代码、状态描写叙述、说明: </p> <p>200 OK      //client请求成功 </p> <p>400 Bad Request  //client请求有语法错误,不能被server所理解 </p> <p>401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用  </p> <p>403 Forbidden  //server收到请求。可是拒绝提供服务 </p> <p>404 Not Found  //请求资源不存在,eg:输入了错误的URL </p> <p>500 Internal Server Error //server发生不可预期的错误 </p> <p>503 Server Unavailable  //server当前不能处理client的请求,一段时间后可能恢复正常</p> <h3 id="2、响应正文">2、响应正文</h3> <p>响应正文就是server返回的资源的内容,响应头和正文之间也必须用空行分隔。</p> <p>如:</p> <h3 id="3nbsp、响应头信息">3 、响应头信息</h3> <p>HTTP最常见的响应头例如以下所看到的:</p> <h4 id="cache头域">Cache头域</h4> <blockquote> <p><strong>Date:</strong></p> <p>作用:生成消息的详细时间和日期,即当前的GMT时间。</p> <p>比如: Date: Sun, 17 Mar 2013 08:12:54 GMT</p> <p><strong>Expires:</strong></p> <p>作用: 浏览器会在指定过期时间内使用本地缓存,指明应该在什么时候觉得文档已经过期,从而不再缓存它。</p> <p>比如: Expires: Thu, 19 Nov 1981 08:52:00 GMT  </p> <p><strong>Vary</strong></p> <p>作用:</p> <p>比如: Vary: Accept-Encoding</p> </blockquote> <h4 id="cookielogin-头域-1">Cookie/Login 头域</h4> <blockquote> <p><strong>P3P</strong></p> <p>作用: 用于跨域设置Cookie, 这样能够解决iframe跨域訪问cookie的问题</p> <p>比如: P3P: CP=CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR</p> <p><strong>Set-Cookie</strong></p> <p>作用: 很重要的header, 用于把cookie 发送到client浏览器。 每个写入cookie都会生成一个Set-Cookie.</p> <p>比如: Set-Cookie: PHPSESSID=c0huq7pdkmm5gg6osoe3mgjmm3; path=/</p> </blockquote> <h4 id="entity实体头域:">Entity实体头域:</h4> <p><strong>实体内容的属性,包含实体信息类型。长度,压缩方法,最后一次改动时间,数据有效性等。</strong></p> <blockquote> <p><strong>ETag:</strong></p> <p>作用:  和If-None-Match 配合使用。 (实例请看上节中If-None-Match的实例)</p> <p>比如: ETag: "03f2b33c0bfcc1:0"</p> <p><strong>Last-Modified:</strong></p> <p>作用: 用于指示资源的最后改动日期和时间。(实例请看上节的If-Modified-Since的实例)</p> <p>比如: Last-Modified: Wed, 21 Dec 2011 09:09:10 GMT</p> <p><strong>Content-Type:</strong></p> <p>作用:WEBserver告诉浏览器自己响应的对象的类型和字符集,</p> <p>比如:</p> <p>Content-Type: text/html; charset=utf-8</p> <p>  Content-Type:text/html;charset=GB2312</p> <p>  Content-Type: image/jpeg</p> <p><strong>Content-Length:</strong></p> <p>指明实体正文的长度,以字节方式存储的十进制数字来表示。在数据下行的过程中,Content-Length的方式要预先在server中缓存全部数据,然后全部数据再一股脑儿地发给client。</p> <p>  比如: Content-Length: 19847</p> <p><strong>Content-Encoding:</strong></p> <p>作用:文档的编码(Encode)方法。通常是压缩方式。</p> <p>WEBserver表明自己使用了什么压缩方法(gzip。deflate)压缩响应中的对象。利用gzip压缩文档可以显著地降低HTML文档的下载时间。</p> <p>比如:Content-Encoding:gzip</p> <p><strong>Content-Language:</strong></p> <p>作用: WEBserver告诉浏览器自己响应的对象的语言者</p> <p>比如: Content-Language:da</p> </blockquote> <h4 id="miscellaneous-头域-1">Miscellaneous 头域</h4> <blockquote> <p><strong>Server:</strong></p> <p>作用:指明HTTPserver的软件信息</p> <p>比如:Apache/2.2.8 (Win32) PHP/5.2.5</p> <p><strong>X-Powered-By:</strong></p> <p>作用:表示站点是用什么技术开发的</p> <p>比如: X-Powered-By: PHP/5.2.5</p> </blockquote> <h4 id="transport头域">Transport头域</h4> <blockquote> <p><strong>Connection:</strong></p> <p>比如: Connection: keep-alive   当一个网页打开完毕后,client和server之间用于传输HTTP数据的TCP连接不会关闭。假设client再次訪问这个server上的网页,会继续使用这一条已经建立的连接</p> <p>比如:  Connection: close  代表一个Request完毕后。client和server之间用于传输HTTP数据的TCP连接会关闭, 当client再次发送Request,须要又一次建立TCP连接。</p> </blockquote> <h4 id="location头域">Location头域</h4> <blockquote> <p><strong>Location:</strong></p> <p>作用: 用于重定向一个新的位置, 包括新的URL地址</p> <p>实例请看304状态实例</p> </blockquote> <h3 id="http协议是无状态的和connection-keep-alive的差别">HTTP协议是无状态的和Connection: keep-alive的差别</h3> <p>  无状态是指协议对于事务处理没有记忆能力。server不知道client是什么状态。从还有一方面讲。打开一个server上的网页和你之前打开这个server上的网页之间没有不论什么联系。</p> <p>  HTTP是一个无状态的面向连接的协议,无状态不代表HTTP不能保持TCP连接。更不能代表HTTP使用的是UDP协议(无连接)。</p> <p>  从HTTP/1.1起,默认都开启了Keep-Alive,保持连接特性。简单地说,当一个网页打开完毕后。client和server之间用于传输HTTP数据的TCP连接不会关闭。假设client再次訪问这个server上的网页。会继续使用这一条已经建立的连接。</p> <p>  Keep-Alive不会永久保持连接,它有一个保持时间,能够在不同的server软件(如Apache)中设定这个时间。</p> <p>浏览器缓存:包含页面html缓存和图片js,css等资源的缓存。例如以下图,浏览器缓存是基于把页面信息保存到用户本地电脑硬盘里。</p> <p><img class='lazyload' data-src="https://article.cdnof.com/2307/17e3a9c1-ef9e-4bf5-808a-e97f36194137.png" alt="" /></p> <h3 id="1、缓存的长处:">1、缓存的长处:</h3> <p>1)server响应更快:由于请求从缓存server(离client更近)而不是源server被对应。这个过程耗时更少,让server看上去响应更快。</p> <p>2)降低网络带宽消耗:当副本被重用时会减低client的带宽消耗。客户能够节省带宽费用。控制带宽的需求的增长并更易于管理。</p> <h3 id="1、缓存工作原理">1、缓存工作原理</h3> <p>页面缓存状态是由http header决定的。一个浏览器请求信息,一个是server响应信息。主要包含Pragma: no-cache、Cache-Control、 Expires、 Last-Modified、If-Modified-Since。当中Pragma: no-cache由HTTP/1.0规定,Cache-Control由HTTP/1.1规定。</p> <p>工作原理图:</p> <p><img class='lazyload' data-src="https://article.cdnof.com/2307/bddf9be5-43f3-4eef-b21f-63c67994c473.png" alt="" /></p> <p>从图中我们能够看到原理主要分三步:</p> <ol> <li>第一次请求:浏览器通过http的header报头,附带Expires,Cache-Control,Last-Modified/Etag向server请求,此时server记录第一次请求的Last-Modified/Etag</li> <li>再次请求:当浏览器再次请求的时候,请求头附带Expires。Cache-Control,If-Modified-Since/Etag向server请求</li> <li>server依据第一次记录的Last-Modified/Etag和再次请求的If-Modified-Since/Etag做对照,推断是否须要更新,server通过这两个头推断本地资源未发生变化。客 <br /> 户端不须要又一次下载。返回304响应。常见流程例如以下图所看到的:</li> </ol> <p><img class='lazyload' data-src="https://article.cdnof.com/2307/3712f6e9-40dc-4cec-9ad8-a03a6c7f1ede.jpg" alt="" /> </p> <h3 id="与缓存相关的http扩展消息头">与缓存相关的HTTP扩展消息头</h3> <p>Expires:设置页面过期时间,格林威治时间GMT</p> <p>Cache-Control:更仔细的控制缓存的内容</p> <p>Last-Modified:请求对象最后一次的改动时间 用来推断缓存是否过期 通常由文件的时间信息产生</p> <p>ETag:响应中资源的校验值,在server上某个时段是唯一标识的。</p> <p>ETag是一个能够 与Web资源关联的记号(token)。和Last-Modified功能才不多。也是一个标识符。一般和Last-Modified一起使用,加强server推断的精确度。</p> <p>Date:server的时间</p> <p>If-Modified-Since:client存取的该资源最后一次改动的时间。用来和server端的Last-Modified做比較</p> <p>If-None-Match:client存取的该资源的检验值,同ETag。</p> <p>Cache-Control的主要參数  </p> <p>      Cache-Control: private/public Public 响应会被缓存,而且在多用户间共享。 Private 响应仅仅可以作为私有的缓存,不能再用户间共享。</p> <p>Cache-Control: no-cache:不进行缓存  </p> <p>      Cache-Control: max-age=x:缓存时间 以秒为单位  </p> <p>      Cache-Control: must-revalidate:假设页面是过期的 则去server进行获取。</p> <h3 id="2、关于图片,css,js,flash的缓存">2、关于图片,css,js,flash的缓存</h3> <p>这个主要通过server的配置来实现这个技术,假设使用apacheserver的话。能够使用<strong>mod_expires</strong>模块来实现:</p> <p><strong>编译mod_expires模块:</strong></p> <p>Cd  /root/httpd-2.2.3/modules/metadata</p> <p>/usr/local/apache/bin/apxs -i -a -c mod_expires.c //编译</p> <p>编辑httpd.conf配置:加入以下内容</p> <p><IfModule mod\_expires.c></p> <p>ExpiresActive on</p> <p>ExpiresDefault "access plus 1 month"</p> <p>ExpiresByType text/html "access plus 1 months"</p> <p>ExpiresByType text/css "access plus 1 months"</p> <p>ExpiresByType image/gif "access plus 1 months"</p> <p>ExpiresByType image/jpeg "access plus 1 months"</p> <p>ExpiresByType image/jpg "access plus 1 months"</p> <p>ExpiresByType image/png "access plus 1 months"</p> <p>EXpiresByType application/x-shockwave-flash "access plus 1 months"</p> <p>EXpiresByType application/x-javascript      "access plus 1 months"</p> <p>#ExpiresByType video/x-flv "access plus 1 months"</p> <p></IfModule></p> <p>解释:第一句--开启服务</p> <p>第二句--默认时间是一个月</p> <p>在以下是关于各种类型的资源的缓存时间设置</p></div></div><div class="MuiGrid-root jss8 MuiGrid-item MuiGrid-grid-xs-true MuiGrid-grid-md-3"><div class="MuiTypography-root jss26 MuiTypography-body1"><div class="MuiTypography-root jss27 MuiTypography-body1"><canvas style="height:108px;width:108px" height="108" width="108"></canvas><div class="MuiTypography-root jss28 MuiTypography-body1"><p class="MuiTypography-root jss29 MuiTypography-body1">手机扫一扫</p><p class="MuiTypography-root jss29 MuiTypography-body1">移动阅读更方便</p></div></div></div><div class="MuiTypography-root jss9 MuiTypography-body1"><div class="MuiTypography-root jss30 MuiTypography-body1" style="height:150px"><div class="swiper-container jss32"><div class="swiper-pagination"></div><div class="swiper-wrapper"><div class="swiper-slide jss32"><a class="MuiTypography-root MuiLink-root MuiLink-underlineHover jss32 MuiTypography-colorInherit" target="_blank" rel="nofollow noopener noreferrer" href="https://qd.rs/aliyun"><img alt="阿里云服务器" class="jss31" src="https://article.cdnof.com/promotion/aliyun.jpg"/></a></div><div class="swiper-slide jss32"><a class="MuiTypography-root MuiLink-root MuiLink-underlineHover jss32 MuiTypography-colorInherit" target="_blank" rel="nofollow noopener noreferrer" href="https://qd.rs/tencent"><img alt="腾讯云服务器" class="jss31" src="https://article.cdnof.com/promotion/tencent.jpg"/></a></div><div class="swiper-slide jss32"><a class="MuiTypography-root MuiLink-root MuiLink-underlineHover jss32 MuiTypography-colorInherit" target="_blank" rel="nofollow noopener noreferrer" href="https://qd.rs/qiniu"><img alt="七牛云服务器" class="jss31" src="https://article.cdnof.com/promotion/qiniu.png"/></a></div></div></div></div></div><div class="MuiTypography-root MuiTypography-body1"><div class="MuiTypography-root jss33 MuiTypography-body1"><p class="MuiTypography-root jss34 MuiTypography-body1">你可能感兴趣的文章</p><div class="MuiList-root MuiList-padding" aria-label="main mailbox folders"><div class="MuiTypography-root MuiTypography-body1"><div class="MuiButtonBase-root MuiListItem-root jss37 MuiListItem-gutters MuiListItem-button" tabindex="0" role="button" aria-disabled="false"><div class="MuiListItemIcon-root jss36"><svg class="MuiSvgIcon-root MuiSvgIcon-colorError" focusable="false" viewBox="0 0 24 24" aria-hidden="true"><path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-5 14h-2V9h-2V7h4v10z"></path></svg></div><a class="MuiTypography-root MuiLink-root MuiLink-underlineHover jss35 MuiTypography-colorInherit" target="_blank" href="https://v2as.com/article/3dc92ace-dead-4d96-9be7-9ec1d23c6f66">HTTPS(SSL / TLS)免费证书申请及网站证书部署实战总结</a></div><hr class="MuiDivider-root"/></div><div class="MuiTypography-root MuiTypography-body1"><div class="MuiButtonBase-root MuiListItem-root jss37 MuiListItem-gutters MuiListItem-button" tabindex="0" role="button" aria-disabled="false"><div class="MuiListItemIcon-root jss36"><svg class="MuiSvgIcon-root" focusable="false" viewBox="0 0 24 24" aria-hidden="true"><path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-4 8c0 1.11-.9 2-2 2h-2v2h4v2H9v-4c0-1.11.9-2 2-2h2V9H9V7h4c1.1 0 2 .89 2 2v2z"></path></svg></div><a class="MuiTypography-root MuiLink-root MuiLink-underlineHover jss35 MuiTypography-colorInherit" target="_blank" href="https://v2as.com/article/ebe6b415-6d82-4d9c-89cc-3bd89fedebf2">第15章 高并发服务器编程(2)_I/O多路复用</a></div><hr class="MuiDivider-root"/></div><div class="MuiTypography-root MuiTypography-body1"><div class="MuiButtonBase-root MuiListItem-root jss37 MuiListItem-gutters MuiListItem-button" tabindex="0" role="button" aria-disabled="false"><div class="MuiListItemIcon-root jss36"><svg class="MuiSvgIcon-root MuiSvgIcon-colorSecondary" focusable="false" viewBox="0 0 24 24" aria-hidden="true"><path d="M19.01 3h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-4 7.5c0 .83-.67 1.5-1.5 1.5.83 0 1.5.67 1.5 1.5V15c0 1.11-.9 2-2 2h-4v-2h4v-2h-2v-2h2V9h-4V7h4c1.1 0 2 .89 2 2v1.5z"></path></svg></div><a class="MuiTypography-root MuiLink-root MuiLink-underlineHover jss35 MuiTypography-colorInherit" target="_blank" href="https://v2as.com/article/0f6505b8-9748-41d4-9073-f4a4f7b9ff68">PHP 数据库驱动、连接数据不同方式学习笔记</a></div><hr class="MuiDivider-root"/></div><div class="MuiTypography-root MuiTypography-body1"><div class="MuiButtonBase-root MuiListItem-root jss37 MuiListItem-gutters MuiListItem-button" tabindex="0" role="button" aria-disabled="false"><div class="MuiListItemIcon-root jss36"><p class="MuiTypography-root MuiTypography-body1">4</p></div><a class="MuiTypography-root MuiLink-root MuiLink-underlineHover jss35 MuiTypography-colorInherit" target="_blank" href="https://v2as.com/article/5c1bfbe4-e181-4a43-bf69-f91ed9110e71">centos linux安全和调优 第四十一节课</a></div><hr class="MuiDivider-root"/></div><div class="MuiTypography-root MuiTypography-body1"><div class="MuiButtonBase-root MuiListItem-root jss37 MuiListItem-gutters MuiListItem-button" tabindex="0" role="button" aria-disabled="false"><div class="MuiListItemIcon-root jss36"><p class="MuiTypography-root MuiTypography-body1">5</p></div><a class="MuiTypography-root MuiLink-root MuiLink-underlineHover jss35 MuiTypography-colorInherit" target="_blank" href="https://v2as.com/article/f0a726a8-41bb-4ca4-8cba-1d2202ec2e5c">如何实现一个基于 jupyter 的 microservices</a></div><hr class="MuiDivider-root"/></div><div class="MuiTypography-root MuiTypography-body1"><div class="MuiButtonBase-root MuiListItem-root jss37 MuiListItem-gutters MuiListItem-button" tabindex="0" role="button" aria-disabled="false"><div class="MuiListItemIcon-root jss36"><p class="MuiTypography-root MuiTypography-body1">6</p></div><a class="MuiTypography-root MuiLink-root MuiLink-underlineHover jss35 MuiTypography-colorInherit" target="_blank" href="https://v2as.com/article/399ddecf-95bf-4797-a617-c613c5b34b98">ndoe.js 和npm私有仓库的搭建</a></div><hr class="MuiDivider-root"/></div><div class="MuiTypography-root MuiTypography-body1"><div class="MuiButtonBase-root MuiListItem-root jss37 MuiListItem-gutters MuiListItem-button" tabindex="0" role="button" aria-disabled="false"><div class="MuiListItemIcon-root jss36"><p class="MuiTypography-root MuiTypography-body1">7</p></div><a class="MuiTypography-root MuiLink-root MuiLink-underlineHover jss35 MuiTypography-colorInherit" target="_blank" href="https://v2as.com/article/10bc4779-8155-4bf9-9445-82c9b44fca47">mongoDB 学习笔记纯干货(mongoose、增删改查、聚合、索引、连接、备份与恢复、监控等等)</a></div><hr class="MuiDivider-root"/></div><div class="MuiTypography-root MuiTypography-body1"><div class="MuiButtonBase-root MuiListItem-root jss37 MuiListItem-gutters MuiListItem-button" tabindex="0" role="button" aria-disabled="false"><div class="MuiListItemIcon-root jss36"><p class="MuiTypography-root MuiTypography-body1">8</p></div><a class="MuiTypography-root MuiLink-root MuiLink-underlineHover jss35 MuiTypography-colorInherit" target="_blank" href="https://v2as.com/article/8b019b53-47bb-4cdd-9f98-8787864f2ba9">Redis进阶实践之十五 Redis-cli命令行工具使用详解第二部分(结束)</a></div><hr class="MuiDivider-root"/></div><div class="MuiTypography-root MuiTypography-body1"><div class="MuiButtonBase-root MuiListItem-root jss37 MuiListItem-gutters MuiListItem-button" tabindex="0" role="button" aria-disabled="false"><div class="MuiListItemIcon-root jss36"><p class="MuiTypography-root MuiTypography-body1">9</p></div><a class="MuiTypography-root MuiLink-root MuiLink-underlineHover jss35 MuiTypography-colorInherit" target="_blank" href="https://v2as.com/article/78c5a947-3015-48fd-b703-e1491173c2a3">Istio 庖丁解牛二:sidecar injector</a></div><hr class="MuiDivider-root"/></div><div class="MuiTypography-root MuiTypography-body1"><div class="MuiButtonBase-root MuiListItem-root jss37 MuiListItem-gutters MuiListItem-button" tabindex="0" role="button" aria-disabled="false"><div class="MuiListItemIcon-root jss36"><p class="MuiTypography-root MuiTypography-body1">10</p></div><a class="MuiTypography-root MuiLink-root MuiLink-underlineHover jss35 MuiTypography-colorInherit" target="_blank" href="https://v2as.com/article/3af6b75b-85de-44d9-9c84-b84c07ecc804">蚂蚁金服开源Go语言版Service Mesh数据平面SOFAMosn性能报告</a></div></div></div></div></div></div></div></div><footer style="margin-top:30px"><p class="MuiTypography-root MuiTypography-body2 MuiTypography-colorTextSecondary MuiTypography-alignCenter">Copyright © <a class="MuiTypography-root MuiLink-root MuiLink-underlineHover MuiTypography-colorInherit" href="https://v2as.com" title="哇哦,有大量工具等你探索">V2AS | 问路</a> <!-- -->2025<!-- --> <!-- -->.</p><p class="MuiTypography-root MuiTypography-body2 MuiTypography-colorTextSecondary MuiTypography-alignCenter"><a class="MuiTypography-root MuiLink-root MuiLink-underlineHover MuiTypography-colorInherit" rel="nofollow noopener noreferrer" href="https://beian.miit.gov.cn/">浙ICP备15029886号</a></p></footer></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"article":{"article_id":"52bf444a-e8d2-4c82-b110-cc6288828dfd","title":"HTTP请求具体解释","link":"","description":"做过Socket编程的人都知道,当我们设计一个通信协议时,“消息头/消息体”的切割方式是非经常常使用的。消息头告诉对方这个消息是干什么的,消息体告诉对方怎么干。\nHTTP协议传输的消息也是这样规定的。每个HTTP包都分为HTTP头和HTTP体两部分,消息体是可选的,而消息头是必须的。每当我们打开一个网页,在上面点击右键,选择“查看源文件”,这时看到的HTML代码就是HTTP的消息体。那么消息头能够","image":"https://article.cdnof.com/2307/17e3a9c1-ef9e-4bf5-808a-e97f36194137.png","keywords":["server","HTTP","请求","缓存","client","浏览器","GET","Content","Request","方法"],"created_at":"2023-07-14T00:47:09.68Z","html":"\u003cp\u003e做过Socket编程的人都知道,当我们设计一个通信协议时,“消息头/消息体”的切割方式是非经常常使用的。消息头告诉对方这个消息是干什么的,消息体告诉对方怎么干。\u003c/p\u003e\n\u003cp\u003eHTTP协议传输的消息也是这样规定的。每个HTTP包都分为HTTP头和HTTP体两部分,消息体是可选的,而消息头是必须的。每当我们打开一个网页,在上面点击右键,选择“查看源文件”,这时看到的HTML代码就是HTTP的消息体。那么消息头能够通过浏览器的开发工具或者插件能够看到,假设火狐的Firebug。IE的Httpwatch。\u003c/p\u003e\n\u003cp\u003eclient通过发送 HTTP 请求向server请求对资源的訪问。\u0026nbsp;它向server传递了一个数据块。也就是请求信息,HTTP 请求由三部分组成:请求行、\u0026nbsp;\u0026nbsp;请求头和请求正文。\u003c/p\u003e\n\u003cp\u003e请求行:请求方法\u0026nbsp;URI 协议/版本号\u003c/p\u003e\n\u003cp\u003e请求头(Request Header)\u003c/p\u003e\n\u003cp\u003e请求正文\u003c/p\u003e\n\u003cp\u003e以下是一个HTTP请求的数据:\u003c/p\u003e\n\u003cp\u003ePOST /index.php HTTP/1.1 \u003cbr /\u003e\nHost: localhost \u003cbr /\u003e\nUser-Agent: Mozilla/5.0 (Windows NT 5.1; rv:10.0.2) Gecko/20100101 Firefox/10.0.2 \u003cbr /\u003e\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 \u003cbr /\u003e\nAccept-Language: zh-cn,zh;q=0.5 \u003cbr /\u003e\nAccept-Encoding: gzip, deflate \u003cbr /\u003e\nConnection: keep-alive \u003cbr /\u003e\nReferer: \u003ca rel=\"nofollow noopener noreferrer\" target=\\_blank href=\"http://localhost/\" style=\"color: rgb(51, 102, 153); text-decoration: none;\"\u003ehttp://localhost/\u003c/a\u003e \u003cbr /\u003e\nContent-Length:25 \u003cbr /\u003e\nContent-Type:application/x-www-form-urlencoded \u003cbr /\u003e\n\u0026nbsp; \u003cbr /\u003e\nusername=aa\u0026amp;password=1234\u003c/p\u003e\n\u003ch3 id=\"1、请求行:请求方法uri协议版本号\"\u003e1、请求行:请求方法URI协议/版本号\u003c/h3\u003e\n\u003cp\u003e\u0026nbsp;请求的第一行是“方法\u0026nbsp;URL\u0026nbsp; 协议/版本号”,并以 回车换行作为结尾。\u003c/p\u003e\n\u003cp\u003e请求行以空格分隔。格式例如以下:\u003c/p\u003e\n\u003cp\u003ePOST /index.php HTTP/1.1\u003c/p\u003e\n\u003cp\u003e以上代码中“GET”代表请求方法,“//ndex.php”表示URI。“HTTP/1.1代表协议和协议的版本号。\u003c/p\u003e\n\u003cp\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; 依据HTTP标准,HTTP请求能够使用多种请求方法。\u003c/p\u003e\n\u003cp\u003e比如:HTTP1.1支持7种请求方法:GET、POST、HEAD、OPTIONS、PUT、DELETE和TARCE。\u003c/p\u003e\n\u003cp\u003e在Internet应用中,最经常使用的方法是GET和POST。\u003c/p\u003e\n\u003cp\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; URL完整地指定了要訪问的网络资源,通常仅仅要给出相对于server的根文件夹的相对文件夹就可以,因此总是以“/”开头,最后,协议版本号声明了通信过程中使用HTTP的版本号。\u0026nbsp;\u0026nbsp;\u0026nbsp;\u003c/p\u003e\n\u003ch4 id=\"请求方法\"\u003e请求方法\u003c/h4\u003e\n\u003cp\u003e在 HTTP 协议中,HTTP 请求能够使用多种请求方法。这些方法指明了要以何种方式来訪问 Request-URI 所标识的资源。HTTP1.1 支持的请求方法例如以下表所看到的:\u003c/p\u003e\n\u003cp\u003eHTTP1.1 中的请求方式:\u003c/p\u003e\n\u003cp\u003e方法\u003c/p\u003e\n\u003cp\u003e作用\u003c/p\u003e\n\u003cp\u003eGET\u003c/p\u003e\n\u003cp\u003e请求获取由 Request-URI 所标识的资源\u003c/p\u003e\n\u003cp\u003ePOST\u003c/p\u003e\n\u003cp\u003e请求server接收在请求中封装的实体。并将其作为由 Request-Line 中的 Request-URI 所标识的资源的一部分\u003c/p\u003e\n\u003cp\u003eHEAD\u003c/p\u003e\n\u003cp\u003e请求获取由 Request-URI 所标识的资源的响应消息报头\u003c/p\u003e\n\u003cp\u003ePUT\u003c/p\u003e\n\u003cp\u003e请求server存储一个资源,并用 Request-URI 作为其标识符\u003c/p\u003e\n\u003cp\u003eDELETE\u003c/p\u003e\n\u003cp\u003e请求server删除由 Request-URI 所标识的资源\u003c/p\u003e\n\u003cp\u003eTRACE\u003c/p\u003e\n\u003cp\u003e请求server回送到的请求信息,主要用于測试或诊断\u003c/p\u003e\n\u003cp\u003eCONNECT\u003c/p\u003e\n\u003cp\u003e保留将来使用\u003c/p\u003e\n\u003cp\u003eOPTIONS\u003c/p\u003e\n\u003cp\u003e请求查询server的性能。或者查询与资源相关的选项和需求\u003c/p\u003e\n\u003cp\u003e重点介绍\u0026nbsp;GET、POST 和 HEAD 三个方法:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e(1)GET\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eGET 方法用于获取由 Request-URI 所标识的资源的信息,常见的形式是:\u003c/p\u003e\n\u003cp\u003eGET Request-URI HTTP/1.1 \u003c/p\u003e\n\u003cp\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; GET方法是默认的HTTP请求方法,比如当我们通过在浏览器的地址栏中直接输入网址的方式去訪问网页的时候,浏览器採用的就是 GET 方法向server获取资源。\u003c/p\u003e\n\u003cp\u003e我们能够使用GET方法来提交表单数据,用GET方法提交的表单数据仅仅经过了简单的编码,同一时候它将作为URL的一部分向server发送,因此。假设使用GET方法来提交表单数据就存在着安全隐患上。比如: \u003c/p\u003e\n\u003cp\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u003ca rel=\"nofollow noopener noreferrer\" href=\"http://127.0.0.1/login.jsp?Name=zhangshi\u0026Age=30\u0026Submit=%cc%E+%BD%BB\"\u003eHttp://localhost/login.php?\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca rel=\"nofollow noopener noreferrer\" href=\"http://127.0.0.1/login.jsp?Name=zhangshi\u0026Age=30\u0026Submit=%cc%E+%BD%BB\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca rel=\"nofollow noopener noreferrer\" href=\"http://127.0.0.1/login.jsp?Name=zhangshi\u0026Age=30\u0026Submit=%cc%E+%BD%BB\"\u003eusername=aa\u0026password=1234\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e从上面的URL请求中,非常easy就能够辩认出表单提交的内容。\u003c/p\u003e\n\u003cp\u003e(?之后的内容)另外由于GET方法提交的数据是作为URL请求的一部分所以提交的数据量不能太大。\u003c/p\u003e\n\u003cp\u003e这是由于浏览器对url的长度有限制\u003c/p\u003e\n\u003cp\u003e各种浏览器也会对url的长度有所限制。以下是几种常见浏览器的url长度限制:(单位:字符)\u003c/p\u003e\n\u003cp\u003eIE : 2803\u003c/p\u003e\n\u003cp\u003eFirefox:65536\u003c/p\u003e\n\u003cp\u003eChrome:8182\u003c/p\u003e\n\u003cp\u003eSafari:80000\u003c/p\u003e\n\u003cp\u003eOpera:190000\u0026nbsp; \u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e(2)POST\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003ePOST方法是GET方法的一个替代方法。它主要是向Webserver提交表单数据,尤其是大批量的数据。\u0026nbsp;在请求头信息结束之后的两个回车换行之后(实际是空一行),就是表单提交的数据。如上面提到的post表单数据:\u003c/p\u003e\n\u003cp\u003eusername=aa\u0026amp;password=1234\u003c/p\u003e\n\u003cp\u003ePOST方法克服了GET方法的一些缺点。\u003c/p\u003e\n\u003cp\u003e通过POST方法提交表单数据时,数据不是作为URL请求的一部分而是作为标准数据传送给Webserver。这就克服了GET方法中的信息无法保密和数据量太小的缺点。因此,出于安全的考虑以及对用户隐私的尊重。通常表单提交时採用POST方法。\u003c/p\u003e\n\u003cp\u003e  从编程的角度来讲,假设用户通过GET方法提交数据,则数据存放在QUERY_STRING环境变量中,而POST方法提交的数据则能够从标准输入流中获取。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eGET与POST方法有下面差别:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e1、\u0026nbsp; 在client,Get方式在通过URL提交数据,数据在URL中能够看到;POST方式。数据放在HTTP包的body中。\u003c/p\u003e\n\u003cp\u003e2、 GET方式提交的数据大小有限制(由于浏览器对URL的长度有限制),而POST则没有此限制。\u003c/p\u003e\n\u003cp\u003e3、安全性问题。正如在(1)中提到,使用 Get 的时候。參数会显示在地址栏上。而 Post 不会。所以。假设这些数据是中文数据并且是非敏感数据,那么使用 get。假设用户输入的数据不是中文字符并且包括敏感数据。那么还是使用 post为好。\u003c/p\u003e\n\u003cp\u003e4.、server取值方式不一样。GET方式取值,如php能够使用$_GET来取得变量的值,而POST方式通过$_POST来获取变量的值。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e(3)HEAD\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eHEAD 方法与 GET 方法差点儿是同样的,它们的差别在于 HEAD 方法仅仅是请求消息报头,而不是完整的内容。对于 HEAD 请求的回应部分来说,它的 HTTP 头部中包括的信息与通过 GET 请求所得到的信息是同样的。\u003c/p\u003e\n\u003cp\u003e利用这种方法,不必传输整个资源内容。就能够得到 Request-URI 所标识的资源的信息。这种方法通常被用于測试超链接的有效性。能否够訪问,以及近期是否更新。\u003c/p\u003e\n\u003cp\u003e要注意的是。在 HTML 文档中,书写 get 和 post,大写和小写都能够,但在 HTTP 协议中的 GET 和 POST 仅仅能是大写形式。\u003c/p\u003e\n\u003ch3 id=\"2-请求头\"\u003e2. 请求头\u003c/h3\u003e\n\u003cp\u003e每一个头域由一个域名。冒号(:)和域值三部分组成。域名是大写和小写无关的,域值前能够加入不论什么数量的空格符,头域能够被扩展为多行,在每行開始处,使用至少一个空格或制表符。\u003c/p\u003e\n\u003cp\u003eHTTP最常见的请求头例如以下:\u003c/p\u003e\n\u003ch4 id=\"transport-头域\"\u003eTransport 头域\u003c/h4\u003e\n\u003cblockquote\u003e\n \u003cp\u003e\u003cstrong\u003eConnection:\u003c/strong\u003e\u003c/p\u003e\n \u003cp\u003e作用:表示是否须要持久连接。\u003c/p\u003e\n \u003cp\u003e假设server看到这里的值为“Keep-Alive”。或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接),它就能够利用持久连接的长处,当页面包括多个元素时(比如Applet。图片)。显著地降低下载所须要的时间。要实现这一点,server须要在应答中发送一个Content-Length头。最简单的实现方法是:先把内容写入 \u003cbr /\u003e\n ByteArrayOutputStream,然后在正式写出内容之前计算它的大小;\u003c/p\u003e\n \u003cp\u003e比如: Connection: keep-alive\u0026nbsp;\u0026nbsp; 当一个网页打开完毕后,client和server之间用于传输HTTP数据的TCP连接不会关闭。假设client再次訪问这个server上的\u0026nbsp;\u0026nbsp;网页,会继续使用这一条已经建立的连接\u003c/p\u003e\n \u003cp\u003e比如:\u0026nbsp; Connection: close\u0026nbsp; 代表一个Request完毕后,client和server之间用于传输HTTP数据的TCP连接会关闭,\u0026nbsp;\u0026nbsp;当client再次发送Request,须要又一次建立TCP连接。\u003c/p\u003e\n \u003cp\u003e\u003cstrong\u003eHost(发送请求时,该报头域是必需的)\u003c/strong\u003e\u003c/p\u003e\n \u003cp\u003eHost请求报头域主要用于指定被请求资源的Internet主机和port号,它通常从HTTP URL中提取出来的。\u003c/p\u003e\n \u003cp\u003eeg:\u003ca rel=\"nofollow noopener noreferrer\" href=\"http://%3Blocalhost/index.html\"\u003ehttp://。localhost/index.html\u003c/a\u003e \u003c/p\u003e\n \u003cp\u003e浏览器发送的请求消息中,就会包括Host请求报头域。例如以下: \u003c/p\u003e\n \u003cp\u003eHost:\u003ca rel=\"nofollow noopener noreferrer\" href=\"http://www.guet.edu.cn/\"\u003elocalhos\u003c/a\u003et\u003c/p\u003e\n \u003cp\u003e此处使用缺省port号80,若指定了port号8080,则变成:Host:localhost:8080\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch4 id=\"client-头域\"\u003eClient 头域\u003c/h4\u003e\n\u003cblockquote\u003e\n \u003cp\u003e\u003cstrong\u003eAccept:\u003c/strong\u003e\u003c/p\u003e\n \u003cp\u003e作用:浏览器能够接受的媒体类型(MIME类型),\u003c/p\u003e\n \u003cp\u003e比如:\u0026nbsp; Accept: text/html \u0026nbsp;代表浏览器能够接受server回发的类型为 text/html \u0026nbsp;也就是我们常说的html文档, 假设server无法返回text/html类型的数据,server应该返回一个406错误(non acceptable)。\u003c/p\u003e\n \u003cp\u003e通配符 * 代表随意类型。比如 \u0026nbsp;Accept: */* \u0026nbsp;代表浏览器能够处理全部类型,(一般浏览器发给server都是发这个)\u003c/p\u003e\n \u003cp\u003e\u003cstrong\u003eAccept-Encoding:\u003c/strong\u003e\u003c/p\u003e\n \u003cp\u003e作用: 浏览器申明自己接收的编码方法。通常指定压缩方法,是否支持压缩。支持什么压缩方法(gzip,deflate),(注意:这不是仅仅字符编码);\u003c/p\u003e\n \u003cp\u003e比如: Accept-Encoding: gzip, deflate。Server可以向支持gzip/deflate的浏览器返回经gzip或者deflate编码的HTML页面。\u0026nbsp;很多情形下这可以降低5到10倍的下载时间,也节省带宽。\u003c/p\u003e\n \u003cp\u003e\u003cstrong\u003eAccept-Language:\u003c/strong\u003e\u003c/p\u003e\n \u003cp\u003e作用: 浏览器申明自己接收的语言。\u003c/p\u003e\n \u003cp\u003e语言跟字符集的差别:中文是语言,中文有多种字符集,比方big5,gb2312,gbk等等;\u003c/p\u003e\n \u003cp\u003e比如: Accept-Language:zh-cn\u0026nbsp;。假设请求消息中没有设置这个报头域,server假定client对各种语言都能够接受。\u003c/p\u003e\n \u003cp\u003e\u003cstrong\u003eUser-Agent:\u003c/strong\u003e\u003c/p\u003e\n \u003cp\u003e作用:告诉HTTPserver。 client使用的操作系统和浏览器的名称和版本号.\u003c/p\u003e\n \u003cp\u003e我们上网登陆论坛的时候,往往会看到一些欢迎信息,当中列出了你的操作系统的名称和版本号。你所使用的浏览器的名称和版本号,这往往让非常多人感到非常奇妙,实际上,\u0026nbsp;server应用程序就是从User-Agent这个请求报头域中获取到这些信息User-Agent请求报头域同意client将它的操作系统、浏览器和其他属性告诉server。\u003c/p\u003e\n \u003cp\u003e比如: User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; CIBA; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; InfoPath.2; .NET4.0E)\u003c/p\u003e\n \u003cp\u003e\u003cstrong\u003eAccept-Charset:\u003c/strong\u003e\u003c/p\u003e\n \u003cp\u003e作用:浏览器申明自己接收的字符集,这就是本文前面介绍的各种字符集和字符编码。如gb2312,utf-8(通常我们说Charset包含了对应的字符编码方案);\u003c/p\u003e\n \u003cp\u003e比如:Accept-Charset:iso-8859-1,gb2312.假设在请求消息中没有设置这个域,缺省是不论什么字符集都能够接受。\u003c/p\u003e\n \u003cp\u003e\u003cstrong\u003eAuthorization\u003c/strong\u003e:授权信息。通常出如今对server发送的WWW-Authenticate头的应答中;\u003c/p\u003e\n \u003cp\u003eAuthorization请求报头域主要用于证明client有权查看某个资源。当浏览器訪问一个页面时,假设收到server的响应代码为401(未授权)。能够发送一个包含Authorization请求报头域的请求,要求server对其进行验证。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch4 id=\"cookielogin-头域\"\u003eCookie/Login 头域\u003c/h4\u003e\n\u003cblockquote\u003e\n \u003cp\u003e\u003cstrong\u003eCookie:\u003c/strong\u003e\u003c/p\u003e\n \u003cp\u003e作用: 最重要的header, 将cookie的值发送给HTTP server\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch4 id=\"entity头域\"\u003eEntity头域\u003c/h4\u003e\n\u003cblockquote\u003e\n \u003cp\u003e\u003cstrong\u003eContent-Length\u003c/strong\u003e\u003c/p\u003e\n \u003cp\u003e作用:发送给HTTPserver数据的长度。\u003c/p\u003e\n \u003cp\u003e即请求消息正文的长度。\u003c/p\u003e\n \u003cp\u003e比如: Content-Length: 38\u003c/p\u003e\n \u003cp\u003e\u003cstrong\u003eContent-Type:\u003c/strong\u003e\u003c/p\u003e\n \u003cp\u003e作用:\u003c/p\u003e\n \u003cp\u003e比如:Content-Type: application/x-www-form-urlencoded\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch4 id=\"miscellaneous-头域\"\u003eMiscellaneous 头域\u003c/h4\u003e\n\u003cblockquote\u003e\n \u003cp\u003e\u003cstrong\u003eReferer:\u003c/strong\u003e\u003c/p\u003e\n \u003cp\u003e作用: 提供了Request的上下文信息的server,告诉server我是从哪个链接过来的。比方从我主页上链接到一个朋友那里,\u0026nbsp;他的server就行从HTTP Referer中统计出每天有多少用户点击我主页上的链接訪问\u0026nbsp;\u0026nbsp;\u0026nbsp; 他的站点。\u003c/p\u003e\n \u003cp\u003e比如: Referer:\u003ca rel=\"nofollow noopener noreferrer\" href=\"http://translate.google.cn/?hl=zh-cn\u0026tab=wT\"\u003ehttp://translate.google.cn/?hl=zh-cn\u0026tab=wT\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch4 id=\"cache-头域\"\u003eCache 头域\u003c/h4\u003e\n\u003cblockquote\u003e\n \u003cp\u003e\u003cstrong\u003eIf-Modified-Since:\u003c/strong\u003e\u003c/p\u003e\n \u003cp\u003e作用: 把浏览器端缓存页面的最后改动时间发送到server去。server会把这个时间与server上实际文件的最后改动时间进行对照。假设时间一致,那么返回304,client就直接使用本地缓存文件。假设时间不一致。就会返回200和新的文件内容。client接到之后。会丢弃旧文件,把新文件缓存起来,并显示在浏览器中。\u003c/p\u003e\n \u003cp\u003e比如:If-Modified-Since: Thu, 09 Feb 2012 09:07:57 GMT。\u003c/p\u003e\n \u003cp\u003e\u003cstrong\u003eIf-None-Match:\u003c/strong\u003e\u003c/p\u003e\n \u003cp\u003e作用: If-None-Match和ETag一起工作。工作原理是在HTTP Response中加入ETag信息。 当用户再次请求该资源时,将在HTTP Request 中加入If-None-Match信息(ETag的值)。\u003c/p\u003e\n \u003cp\u003e假设server验证资源的ETag没有改变(该资源没有更新),将返回一个304状态告诉client使用本地缓存文件。否则将返回200状态和新的资源和Etag.\u0026nbsp; 使用这种机制将提高站点的性能\u003c/p\u003e\n \u003cp\u003e比如: If-None-Match: \"03f2b33c0bfcc1:0\"\u003c/p\u003e\n \u003cp\u003e\u003cstrong\u003ePragma:\u003c/strong\u003e\u003c/p\u003e\n \u003cp\u003e作用: 防止页面被缓存, 在HTTP/1.1版本号中。它和Cache-Control:no-cache作用一模一样\u003c/p\u003e\n \u003cp\u003ePargma仅仅有一个使用方法, 比如: Pragma: no-cache\u003c/p\u003e\n \u003cp\u003e注意: 在HTTP/1.0版本号中。仅仅实现了Pragema:no-cache, 没有实现Cache-Control\u003c/p\u003e\n \u003cp\u003e\u003cstrong\u003eCache-Control:\u003c/strong\u003e\u003c/p\u003e\n \u003cp\u003e作用: 这个是很重要的规则。 这个用来指定Response-Request遵循的缓存机制。各个指令含义例如以下\u003c/p\u003e\n \u003cp\u003eCache-Control:Public\u0026nbsp;\u0026nbsp; 能够被不论什么缓存所缓存()\u003c/p\u003e\n \u003cp\u003eCache-Control:Private\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; 内容仅仅缓存到私有缓存中\u003c/p\u003e\n \u003cp\u003eCache-Control:no-cache\u0026nbsp; 全部内容都不会被缓存\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e在接收和解释请求消息后,server会返回一个 HTTP 响应消息。与 HTTP 请求类似,HTTP 响应也是由三个部分组成,各自是:状态行、消息报头和响应正文。\u003c/p\u003e\n\u003cp\u003e如:\u003c/p\u003e\n\u003cp\u003eHTTP/1.1 200 OK \nDate: Sun, 17 Mar 2013 08:12:54 GMT \nServer: Apache/2.2.8 (Win32) PHP/5.2.5 \nX-Powered-By: PHP/5.2.5 \nSet-Cookie: PHPSESSID=c0huq7pdkmm5gg6osoe3mgjmm3; path=/ \nExpires: Thu, 19 Nov 1981 08:52:00 GMT \nCache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 \nPragma: no-cache \nContent-Length: 4393 \nKeep-Alive: timeout=5, max=100 \nConnection: Keep-Alive \nContent-Type: text/html; charset=utf-8\u003c/p\u003e\n\u003cp\u003e \n\u003chtml\u003e \n\u003chead\u003e \n\u003ctitle\u003eHTTP响应演示样例\u003ctitle\u003e \n\u003c/head\u003e \n\u003cbody\u003e \nHello HTTP! \n\u003c/body\u003e \n\u003c/html\u003e\u003c/p\u003e\n\u003cp\u003e\u0026nbsp;\u003c/p\u003e\n\u003ch3 id=\"1、状态行\"\u003e1、状态行\u003c/h3\u003e\n\u003cp\u003e状态行由协议版本号、数字形式的状态代码,及对应的状态描写叙述组成,各元素之间以空格分隔,结尾时回车换行符,格式例如以下:\u003c/p\u003e\n\u003cp\u003eHTTP-Version Status-Code Reason-Phrase CRLF\u003c/p\u003e\n\u003cp\u003eHTTP-Version 表示server HTTP 协议的版本号,Status-Code 表示server发回的响应代码,Reason-Phrase 表示状态代码的文本描写叙述。CRLF 表示回车换行。比如:\u003c/p\u003e\n\u003cp\u003eHTTP/1.1 200 OK (CRLF)\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e状态代码与状态描写叙述\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e状态代码由 3 位数字组成, 表示请求是否被理解或被满足。状态描写叙述给出了关于状态码的简短的文字描写叙述。状态码的第一个数字定义了响应类别,后面两位数字没有详细分类。\u003c/p\u003e\n\u003cp\u003e第一个数字有 5 种取值,例如以下所看到的。\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e1xx:指示信息——表示请求已经接受,继续处理\u003c/li\u003e\n\u003cli\u003e2xx:成功——表示请求已经被成功接收、理解、接受。\u003c/li\u003e\n\u003cli\u003e3xx:重定向——要完毕请求必须进行更进一步的操作\u003c/li\u003e\n\u003cli\u003e4xx:client错误——请求有语法错误或请求无法实现\u003c/li\u003e\n\u003cli\u003e5xx:server端错误——server未能实现合法的请求。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e常见状态代码、状态描写叙述、说明: \u003c/p\u003e\n\u003cp\u003e200 OK\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; //client请求成功 \u003c/p\u003e\n\u003cp\u003e400 Bad Request\u0026nbsp; //client请求有语法错误,不能被server所理解 \u003c/p\u003e\n\u003cp\u003e401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用\u0026nbsp; \u003c/p\u003e\n\u003cp\u003e403 Forbidden\u0026nbsp; //server收到请求。可是拒绝提供服务 \u003c/p\u003e\n\u003cp\u003e404 Not Found\u0026nbsp; //请求资源不存在,eg:输入了错误的URL \u003c/p\u003e\n\u003cp\u003e500 Internal Server Error //server发生不可预期的错误 \u003c/p\u003e\n\u003cp\u003e503 Server Unavailable\u0026nbsp; //server当前不能处理client的请求,一段时间后可能恢复正常\u003c/p\u003e\n\u003ch3 id=\"2、响应正文\"\u003e2、响应正文\u003c/h3\u003e\n\u003cp\u003e响应正文就是server返回的资源的内容,响应头和正文之间也必须用空行分隔。\u003c/p\u003e\n\u003cp\u003e如:\u003c/p\u003e\n\u003ch3 id=\"3nbsp、响应头信息\"\u003e3\u0026nbsp;、响应头信息\u003c/h3\u003e\n\u003cp\u003eHTTP最常见的响应头例如以下所看到的:\u003c/p\u003e\n\u003ch4 id=\"cache头域\"\u003eCache头域\u003c/h4\u003e\n\u003cblockquote\u003e\n \u003cp\u003e\u003cstrong\u003eDate:\u003c/strong\u003e\u003c/p\u003e\n \u003cp\u003e作用:生成消息的详细时间和日期,即当前的GMT时间。\u003c/p\u003e\n \u003cp\u003e比如: Date: Sun, 17 Mar 2013 08:12:54 GMT\u003c/p\u003e\n \u003cp\u003e\u003cstrong\u003eExpires:\u003c/strong\u003e\u003c/p\u003e\n \u003cp\u003e作用: 浏览器会在指定过期时间内使用本地缓存,指明应该在什么时候觉得文档已经过期,从而不再缓存它。\u003c/p\u003e\n \u003cp\u003e比如: Expires: Thu, 19 Nov 1981 08:52:00 GMT  \u003c/p\u003e\n \u003cp\u003e\u003cstrong\u003eVary\u003c/strong\u003e\u003c/p\u003e\n \u003cp\u003e作用:\u003c/p\u003e\n \u003cp\u003e比如: Vary: Accept-Encoding\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch4 id=\"cookielogin-头域-1\"\u003eCookie/Login 头域\u003c/h4\u003e\n\u003cblockquote\u003e\n \u003cp\u003e\u003cstrong\u003eP3P\u003c/strong\u003e\u003c/p\u003e\n \u003cp\u003e作用: 用于跨域设置Cookie, 这样能够解决iframe跨域訪问cookie的问题\u003c/p\u003e\n \u003cp\u003e比如: P3P: CP=CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR\u003c/p\u003e\n \u003cp\u003e\u003cstrong\u003eSet-Cookie\u003c/strong\u003e\u003c/p\u003e\n \u003cp\u003e作用: 很重要的header, 用于把cookie 发送到client浏览器。 每个写入cookie都会生成一个Set-Cookie.\u003c/p\u003e\n \u003cp\u003e比如: Set-Cookie: PHPSESSID=c0huq7pdkmm5gg6osoe3mgjmm3; path=/\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch4 id=\"entity实体头域:\"\u003eEntity实体头域:\u003c/h4\u003e\n\u003cp\u003e\u003cstrong\u003e实体内容的属性,包含实体信息类型。长度,压缩方法,最后一次改动时间,数据有效性等。\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n \u003cp\u003e\u003cstrong\u003eETag:\u003c/strong\u003e\u003c/p\u003e\n \u003cp\u003e作用:\u0026nbsp; 和If-None-Match 配合使用。 (实例请看上节中If-None-Match的实例)\u003c/p\u003e\n \u003cp\u003e比如: ETag: \"03f2b33c0bfcc1:0\"\u003c/p\u003e\n \u003cp\u003e\u003cstrong\u003eLast-Modified:\u003c/strong\u003e\u003c/p\u003e\n \u003cp\u003e作用: 用于指示资源的最后改动日期和时间。(实例请看上节的If-Modified-Since的实例)\u003c/p\u003e\n \u003cp\u003e比如: Last-Modified: Wed, 21 Dec 2011 09:09:10 GMT\u003c/p\u003e\n \u003cp\u003e\u003cstrong\u003eContent-Type:\u003c/strong\u003e\u003c/p\u003e\n \u003cp\u003e作用:WEBserver告诉浏览器自己响应的对象的类型和字符集,\u003c/p\u003e\n \u003cp\u003e比如:\u003c/p\u003e\n \u003cp\u003eContent-Type: text/html; charset=utf-8\u003c/p\u003e\n \u003cp\u003e  Content-Type:text/html;charset=GB2312\u003c/p\u003e\n \u003cp\u003e  Content-Type: image/jpeg\u003c/p\u003e\n \u003cp\u003e\u003cstrong\u003eContent-Length:\u003c/strong\u003e\u003c/p\u003e\n \u003cp\u003e指明实体正文的长度,以字节方式存储的十进制数字来表示。在数据下行的过程中,Content-Length的方式要预先在server中缓存全部数据,然后全部数据再一股脑儿地发给client。\u003c/p\u003e\n \u003cp\u003e  比如: Content-Length: 19847\u003c/p\u003e\n \u003cp\u003e\u003cstrong\u003eContent-Encoding:\u003c/strong\u003e\u003c/p\u003e\n \u003cp\u003e作用:文档的编码(Encode)方法。通常是压缩方式。\u003c/p\u003e\n \u003cp\u003eWEBserver表明自己使用了什么压缩方法(gzip。deflate)压缩响应中的对象。利用gzip压缩文档可以显著地降低HTML文档的下载时间。\u003c/p\u003e\n \u003cp\u003e比如:Content-Encoding:gzip\u003c/p\u003e\n \u003cp\u003e\u003cstrong\u003eContent-Language:\u003c/strong\u003e\u003c/p\u003e\n \u003cp\u003e作用: WEBserver告诉浏览器自己响应的对象的语言者\u003c/p\u003e\n \u003cp\u003e比如: Content-Language:da\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch4 id=\"miscellaneous-头域-1\"\u003eMiscellaneous 头域\u003c/h4\u003e\n\u003cblockquote\u003e\n \u003cp\u003e\u003cstrong\u003eServer:\u003c/strong\u003e\u003c/p\u003e\n \u003cp\u003e作用:指明HTTPserver的软件信息\u003c/p\u003e\n \u003cp\u003e比如:Apache/2.2.8 (Win32) PHP/5.2.5\u003c/p\u003e\n \u003cp\u003e\u003cstrong\u003eX-Powered-By:\u003c/strong\u003e\u003c/p\u003e\n \u003cp\u003e作用:表示站点是用什么技术开发的\u003c/p\u003e\n \u003cp\u003e比如: X-Powered-By: PHP/5.2.5\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch4 id=\"transport头域\"\u003eTransport头域\u003c/h4\u003e\n\u003cblockquote\u003e\n \u003cp\u003e\u003cstrong\u003eConnection:\u003c/strong\u003e\u003c/p\u003e\n \u003cp\u003e比如: Connection: keep-alive\u0026nbsp;\u0026nbsp; 当一个网页打开完毕后,client和server之间用于传输HTTP数据的TCP连接不会关闭。假设client再次訪问这个server上的网页,会继续使用这一条已经建立的连接\u003c/p\u003e\n \u003cp\u003e比如:\u0026nbsp; Connection: close\u0026nbsp; 代表一个Request完毕后。client和server之间用于传输HTTP数据的TCP连接会关闭, 当client再次发送Request,须要又一次建立TCP连接。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch4 id=\"location头域\"\u003eLocation头域\u003c/h4\u003e\n\u003cblockquote\u003e\n \u003cp\u003e\u003cstrong\u003eLocation:\u003c/strong\u003e\u003c/p\u003e\n \u003cp\u003e作用: 用于重定向一个新的位置, 包括新的URL地址\u003c/p\u003e\n \u003cp\u003e实例请看304状态实例\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch3 id=\"http协议是无状态的和connection-keep-alive的差别\"\u003eHTTP协议是无状态的和Connection: keep-alive的差别\u003c/h3\u003e\n\u003cp\u003e  无状态是指协议对于事务处理没有记忆能力。server不知道client是什么状态。从还有一方面讲。打开一个server上的网页和你之前打开这个server上的网页之间没有不论什么联系。\u003c/p\u003e\n\u003cp\u003e  HTTP是一个无状态的面向连接的协议,无状态不代表HTTP不能保持TCP连接。更不能代表HTTP使用的是UDP协议(无连接)。\u003c/p\u003e\n\u003cp\u003e  从HTTP/1.1起,默认都开启了Keep-Alive,保持连接特性。简单地说,当一个网页打开完毕后。client和server之间用于传输HTTP数据的TCP连接不会关闭。假设client再次訪问这个server上的网页。会继续使用这一条已经建立的连接。\u003c/p\u003e\n\u003cp\u003e  Keep-Alive不会永久保持连接,它有一个保持时间,能够在不同的server软件(如Apache)中设定这个时间。\u003c/p\u003e\n\u003cp\u003e浏览器缓存:包含页面html缓存和图片js,css等资源的缓存。例如以下图,浏览器缓存是基于把页面信息保存到用户本地电脑硬盘里。\u003c/p\u003e\n\u003cp\u003e\u003cimg class='lazyload' data-src=\"https://article.cdnof.com/2307/17e3a9c1-ef9e-4bf5-808a-e97f36194137.png\" alt=\"\" /\u003e\u003c/p\u003e\n\u003ch3 id=\"1、缓存的长处:\"\u003e1、缓存的长处:\u003c/h3\u003e\n\u003cp\u003e1)server响应更快:由于请求从缓存server(离client更近)而不是源server被对应。这个过程耗时更少,让server看上去响应更快。\u003c/p\u003e\n\u003cp\u003e2)降低网络带宽消耗:当副本被重用时会减低client的带宽消耗。客户能够节省带宽费用。控制带宽的需求的增长并更易于管理。\u003c/p\u003e\n\u003ch3 id=\"1、缓存工作原理\"\u003e1、缓存工作原理\u003c/h3\u003e\n\u003cp\u003e页面缓存状态是由http header决定的。一个浏览器请求信息,一个是server响应信息。主要包含Pragma: no-cache、Cache-Control、 Expires、 Last-Modified、If-Modified-Since。当中Pragma: no-cache由HTTP/1.0规定,Cache-Control由HTTP/1.1规定。\u003c/p\u003e\n\u003cp\u003e工作原理图:\u003c/p\u003e\n\u003cp\u003e\u003cimg class='lazyload' data-src=\"https://article.cdnof.com/2307/bddf9be5-43f3-4eef-b21f-63c67994c473.png\" alt=\"\" /\u003e\u003c/p\u003e\n\u003cp\u003e从图中我们能够看到原理主要分三步:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e第一次请求:浏览器通过http的header报头,附带Expires,Cache-Control,Last-Modified/Etag向server请求,此时server记录第一次请求的Last-Modified/Etag\u003c/li\u003e\n\u003cli\u003e再次请求:当浏览器再次请求的时候,请求头附带Expires。Cache-Control,If-Modified-Since/Etag向server请求\u003c/li\u003e\n\u003cli\u003eserver依据第一次记录的Last-Modified/Etag和再次请求的If-Modified-Since/Etag做对照,推断是否须要更新,server通过这两个头推断本地资源未发生变化。客 \u003cbr /\u003e\n户端不须要又一次下载。返回304响应。常见流程例如以下图所看到的:\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cimg class='lazyload' data-src=\"https://article.cdnof.com/2307/3712f6e9-40dc-4cec-9ad8-a03a6c7f1ede.jpg\" alt=\"\" /\u003e \u003c/p\u003e\n\u003ch3 id=\"与缓存相关的http扩展消息头\"\u003e与缓存相关的HTTP扩展消息头\u003c/h3\u003e\n\u003cp\u003eExpires:设置页面过期时间,格林威治时间GMT\u003c/p\u003e\n\u003cp\u003eCache-Control:更仔细的控制缓存的内容\u003c/p\u003e\n\u003cp\u003eLast-Modified:请求对象最后一次的改动时间 用来推断缓存是否过期 通常由文件的时间信息产生\u003c/p\u003e\n\u003cp\u003eETag:响应中资源的校验值,在server上某个时段是唯一标识的。\u003c/p\u003e\n\u003cp\u003eETag是一个能够 与Web资源关联的记号(token)。和Last-Modified功能才不多。也是一个标识符。一般和Last-Modified一起使用,加强server推断的精确度。\u003c/p\u003e\n\u003cp\u003eDate:server的时间\u003c/p\u003e\n\u003cp\u003eIf-Modified-Since:client存取的该资源最后一次改动的时间。用来和server端的Last-Modified做比較\u003c/p\u003e\n\u003cp\u003eIf-None-Match:client存取的该资源的检验值,同ETag。\u003c/p\u003e\n\u003cp\u003eCache-Control的主要參数\u0026nbsp; \u003c/p\u003e\n\u003cp\u003e\u0026nbsp; \u0026nbsp; \u0026nbsp; Cache-Control: private/public Public 响应会被缓存,而且在多用户间共享。 Private 响应仅仅可以作为私有的缓存,不能再用户间共享。\u003c/p\u003e\n\u003cp\u003eCache-Control: no-cache:不进行缓存\u0026nbsp; \u003c/p\u003e\n\u003cp\u003e\u0026nbsp; \u0026nbsp; \u0026nbsp; Cache-Control: max-age=x:缓存时间 以秒为单位\u0026nbsp; \u003c/p\u003e\n\u003cp\u003e\u0026nbsp; \u0026nbsp; \u0026nbsp; Cache-Control: must-revalidate:假设页面是过期的 则去server进行获取。\u003c/p\u003e\n\u003ch3 id=\"2、关于图片,css,js,flash的缓存\"\u003e2、关于图片,css,js,flash的缓存\u003c/h3\u003e\n\u003cp\u003e这个主要通过server的配置来实现这个技术,假设使用apacheserver的话。能够使用\u003cstrong\u003emod_expires\u003c/strong\u003e模块来实现:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e编译mod_expires模块:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eCd\u0026nbsp; /root/httpd-2.2.3/modules/metadata\u003c/p\u003e\n\u003cp\u003e/usr/local/apache/bin/apxs -i -a -c mod_expires.c //编译\u003c/p\u003e\n\u003cp\u003e编辑httpd.conf配置:加入以下内容\u003c/p\u003e\n\u003cp\u003e\u003cIfModule mod\\_expires.c\u003e\u003c/p\u003e\n\u003cp\u003eExpiresActive on\u003c/p\u003e\n\u003cp\u003eExpiresDefault \"access plus 1 month\"\u003c/p\u003e\n\u003cp\u003eExpiresByType text/html \"access plus 1 months\"\u003c/p\u003e\n\u003cp\u003eExpiresByType text/css \"access plus 1 months\"\u003c/p\u003e\n\u003cp\u003eExpiresByType image/gif \"access plus 1 months\"\u003c/p\u003e\n\u003cp\u003eExpiresByType image/jpeg \"access plus 1 months\"\u003c/p\u003e\n\u003cp\u003eExpiresByType image/jpg \"access plus 1 months\"\u003c/p\u003e\n\u003cp\u003eExpiresByType image/png \"access plus 1 months\"\u003c/p\u003e\n\u003cp\u003eEXpiresByType application/x-shockwave-flash \"access plus 1 months\"\u003c/p\u003e\n\u003cp\u003eEXpiresByType application/x-javascript\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"access plus 1 months\"\u003c/p\u003e\n\u003cp\u003e#ExpiresByType video/x-flv \"access plus 1 months\"\u003c/p\u003e\n\u003cp\u003e\u003c/IfModule\u003e\u003c/p\u003e\n\u003cp\u003e解释:第一句--开启服务\u003c/p\u003e\n\u003cp\u003e第二句--默认时间是一个月\u003c/p\u003e\n\u003cp\u003e在以下是关于各种类型的资源的缓存时间设置\u003c/p\u003e"},"seo":{"title":"HTTP请求具体解释","description":"做过Socket编程的人都知道,当我们设计一个通信协议时,“消息头/消息体”的切割方式是非经常常使用的。消息头告诉对方这个消息是干什么的,消息体告诉对方怎么干。\nHTTP协议传输的消息也是这样规定的。每个HTTP包都分为HTTP头和HTTP体两部分,消息体是可选的,而消息头是必须的。每当我们打开一个网页,在上面点击右键,选择“查看源文件”,这时看到的HTML代码就是HTTP的消息体。那么消息头能够","image":"https://article.cdnof.com/2307/17e3a9c1-ef9e-4bf5-808a-e97f36194137.png","url":"https://v2as.com/article/52bf444a-e8d2-4c82-b110-cc6288828dfd","keywords":["server","HTTP","请求","缓存","client","浏览器","GET","Content","Request","方法"]},"viewsCount":1,"promotionList":[{"title":"阿里云服务器","image":"https://article.cdnof.com/promotion/aliyun.jpg","link":"https://qd.rs/aliyun"},{"title":"腾讯云服务器","image":"https://article.cdnof.com/promotion/tencent.jpg","link":"https://qd.rs/tencent"},{"title":"七牛云服务器","image":"https://article.cdnof.com/promotion/qiniu.png","link":"https://qd.rs/qiniu"}],"similarKeywordsList":[{"article_id":"3dc92ace-dead-4d96-9be7-9ec1d23c6f66","title":"HTTPS(SSL / TLS)免费证书申请及网站证书部署实战总结","link":"","description":"服务器环境:windows server 2008  +  tomcat7\n废话不多说,先看部署效果:\n\n\n一、免费证书申请\nLet's Encrypt  简介:let's Encrypt 是一个免费的开放的非盈利证书颁发机构,截至2018年7月底,Let's Encrypt root(ISRG Root X1)直接受到Microsoft产品的信任。\n目前受到所有主要root程序的信任,包括Mic","image":"https://article.cdnof.com/2009/86b48485-ee03-4582-9a26-2445ae426799.jpg","keywords":["证书","https","SSL","HTTPS","ac","TLS","document","referer","www","文件"],"created_at":"0001-01-01T00:00:00Z"},{"article_id":"ebe6b415-6d82-4d9c-89cc-3bd89fedebf2","title":"第15章 高并发服务器编程(2)_I/O多路复用","link":"","description":"3. I/O多路复用:select函数\n3.1 I/O多路复用简介\n(1)通信领域的时分多路复用\n\n(2)I/O多路复用(I/O multiplexing)\n  ①同一线程,通过“拨开关”方式,来同时处理多个I/O流,哪个IO准备就绪就把开关拨向它。(I/O多路复用类似于通信领域中的“时分复用”)\n  ②通过select/poll函数可以实现IO多路复用,他们采用轮询的方式来监视I/O。而epol","image":"https://article.cdnof.com/2009/04369b46-d2ec-4ac3-bbc2-772b443b687c.jpg","keywords":["fd","vfd","int","set","socket","include","select","描述符","buff","并发"],"created_at":"0001-01-01T00:00:00Z"},{"article_id":"0f6505b8-9748-41d4-9073-f4a4f7b9ff68","title":"PHP 数据库驱动、连接数据不同方式学习笔记","link":"","description":"相关学习资料\n\nhttp://www.php.net/manual/zh/refs.database.php\nhttp://www.php.net/manual/zh/internals2.pdo.php\nhttp://bbs.phpchina.com/thread-184537-1-1.html\nhttp://www.metsky.com/archives/660.html\nhttp://www","image":"","keywords":["数据库","PHP","mysql","php","result","http","PDO","ikIJApPKyMAAIUBBgDCCCAAAIIWBWgIGCVk8YQ8EKAgoDFMOadZLHYVeeaws65kFjtEPG1ykljCGQSyPt4pCCQKTysjAACFAQYAwgggAACCFgVoCBglZPGEPBCgIKAxTDmnWSx2FXnmsLOuZBY7RDxtcpJYwhkEsj7eKQgkCk8rIwAAhQEGAMIIIAAAghYFaAgYJWTxhDwQoCCgMUw5p1ksdhV55rCzrmQWO0Q8bXKSWMIZBLI","echo","连接"],"created_at":"0001-01-01T00:00:00Z"},{"article_id":"5c1bfbe4-e181-4a43-bf69-f91ed9110e71","title":"centos linux安全和调优 第四十一节课","link":"","description":"centos  linux安全和调优    第四十一节课\n上半节课\nLinux安全\n下半节课\nLinux调优\n2015-07-01linux安全和调优 [复制链接]--http://www.apelearn.com/bbs/thread-8172-1-1.html\n内容概要:\n一. Linux安全\n1. Linux发行版本选择主流的,更新较快的。从官网获取安装镜像\n2. 硬件和物理安全设置bios","image":"","keywords":["http","tmp","root","com","调优","www","dev","文件","Linux","1."],"created_at":"0001-01-01T00:00:00Z"},{"article_id":"f0a726a8-41bb-4ca4-8cba-1d2202ec2e5c","title":"如何实现一个基于 jupyter 的 microservices","link":"","description":"零、背景:\n\n现有基于 Node.js 的项目,但需要整合 Data Science 同事的基于 python(jupyter) 的代码部分,以实现额外的数据分析功能。于是设想实现一个 microservices。下面介绍一些库的使用方法、自己写的 demo和遇到的坑,方便以后查阅。\n一、jupyter_kernel_gateway\n\n第一步,是想办法把 jupyter 文件当成一个 http s","image":"","keywords":["data","return","ac","ipynb","jupyter","age","req","sex","http","referer"],"created_at":"0001-01-01T00:00:00Z"},{"article_id":"399ddecf-95bf-4797-a617-c613c5b34b98","title":"ndoe.js 和npm私有仓库的搭建","link":"","description":"下载nodejs的压缩包 网址:https://nodejs.org/en/\n下载以tar.xz结尾的包例如:node-v8.9.4-linux-x64.tar.xz\n上传包到制定的目录 可以用lrzsz\n解压:xz -d\nnode-v8.9.4-linux-x64.tar.xz\n然后在 拆包: tar –xvf node-v8.9.4-linux-x64.tar\n配置环境变量在/etc/prof","image":"https://article.cdnof.com/2009/46ce1d12-8bc0-4627-9057-d6163190989c.jpg","keywords":["npm","私有","sinopia","仓库","ac","https","搭建","document","docker","pm2"],"created_at":"0001-01-01T00:00:00Z"},{"article_id":"10bc4779-8155-4bf9-9445-82c9b44fca47","title":"mongoDB 学习笔记纯干货(mongoose、增删改查、聚合、索引、连接、备份与恢复、监控等等)","link":"","description":"最后更新时间:2017-07-13 11:10:49\n原始文章链接:http://www.lovebxm.com/2017/07/13/mongodb_primer/\nMongoDB - 简介\n官网:https://www.mongodb.com/\nMongoDB 是一个基于分布式文件存储的数据库,由 C++ 语言编写,旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。\nMongoDB 是一","image":"https://article.cdnof.com/2009/375ea18d-828c-4405-b384-8e1f19cec391.jpg","keywords":["MongoDB","db","col","文档","数据库","id","索引","title","mongodb","集合"],"created_at":"0001-01-01T00:00:00Z"},{"article_id":"8b019b53-47bb-4cdd-9f98-8787864f2ba9","title":"Redis进阶实践之十五 Redis-cli命令行工具使用详解第二部分(结束)","link":"","description":"一、介绍\n今天继续redis-cli使用的介绍,上一篇文章写了一部分,写到第9个小节,今天就来完成第二部分。话不多说,开始我们今天的讲解。如果要想看第一篇文章,地址如下:http://www.cnblogs.com/PatrickLiu/p/8508975.html\n二、使用详解\n上篇文章写到第9个小节,今天直接按着以上的序号,继续来写\n10、特殊的操作模式\n到目前为止,我们看到了redis-cl","image":"","keywords":["Redis","redis","cli","延迟","root","192.168.127.130","使用","linux","latency","模式"],"created_at":"0001-01-01T00:00:00Z"},{"article_id":"78c5a947-3015-48fd-b703-e1491173c2a3","title":"Istio 庖丁解牛二:sidecar injector","link":"","description":"作者: 钟华,腾讯云容器团队高级工程师,热衷于容器、微服务、service mesh、istio、devops 等领域技术\n\n\n今天我们分析下 istio-sidecar-injector 组件:\n\n\n\n查看高清原图\n\n用户空间的Pod要想加入mesh, 首先需要注入sidecar 容器, istio 提供了2种方式实现注入:\n\n\n自动注入: 利用 Kubernetes Dynamic Admis","image":"https://article.cdnof.com/2009/0e94ceef-7382-4edb-9187-96abdf2bd8e2.jpg","keywords":["istio","sidecar","injector","容器","config","inject","server","proxy","wh","kube"],"created_at":"0001-01-01T00:00:00Z"},{"article_id":"3af6b75b-85de-44d9-9c84-b84c07ecc804","title":"蚂蚁金服开源Go语言版Service Mesh数据平面SOFAMosn性能报告","link":"","description":"以下的的性能报告为 SOFAMosn 0.1.0 在做 Bolt 与 HTTP1.x 协议的纯 TCP 转发上与 envoy 的一些性能对比数据,主要表现在 QPS、RTT、失败率/成功率等。\n\n本文原文来自:https://github.com/alipay/sofa-mosn/blob/master/docs/reference/PerformanceReport.md\n\n这里需要强调的是,为","image":"","keywords":["RT","address","CPU","SOFAMosn","QPS","Envoy","100","value","socket","port"],"created_at":"0001-01-01T00:00:00Z"}]},"__N_SSG":true},"page":"/article/[article_id]","query":{"article_id":"52bf444a-e8d2-4c82-b110-cc6288828dfd"},"buildId":"7EtL49Y65E8zx1NwcIC_o","isFallback":false,"gsp":true,"scriptLoader":[]}</script></body></html>