HTTP 标头字段
HTTP 状态字段包含一个简单的状态代码来标识响应的类型。
200 OK 是第一次查看时的标准响应。
随后的视图或者请求可能会导致 304 Not modified 。
收到 304 响应将允许客户端从其缓存加载页面,而不是从服务器重新下载它。
日期字段表示从服务器发送响应的日期和时间,并不反映实际内容的日期。
开发人员应该使用 last-modified 来代替。
服务器字段通常包含有关服务器操作系统的信息。
Cache-Control 与其他字段结合,控制资源的缓存。
Last-Modified 反映内容或者资源上次修改的日期和时间。
这通常对应于来自数据库的时间戳。
Expires 用于告诉客户端他们应该在不检查新副本的情况下存储缓存副本多长时间(以秒为单位)。
在这种情况下,它是一个负值,它应该强制重新验证,但仍然允许通过 Last-Modified 进行缓存。
Vary 字段告诉代理服务器在其缓存中存储资源的两个副本。
一种是未压缩的,一种是压缩的。
交付哪一个取决于访问客户端的 Accept-Encoding 请求字段。
Transfer-Encoding 特定于 HTTP 1.1,并允许分块传输。
Content-Type 字段用于告诉客户端响应正文的格式,在本例中为使用 UFT-8 字符集编码的 HTML。
手动控制响应头
在 PHP 中,大多数 headers 都可以使用 PHP header 函数来控制,但在很多情况下,这是不需要的。
Apache 也有模块来处理诸如压缩和静态资源缓存之类的事情。
许多响应字段由 Web 服务器自动填写,尤其是对于静态内容。
我们唯一可能需要手动更改的是字符编码和资源缓存。
如果其中一些字段是不需要的,我们可以在 Web 服务器的配置中将其关闭。
静态资源的缓存应该由服务器自动处理,但有时我们可能仍然需要更改相关设置以满足需要,这可以通过编辑服务器配置来完成。
对于动态资源,例如使用 PHP 或者其他语言时,我们可能需要专门编写脚本来处理缓存。
为此,我们可以使用 Etag 标头(检查脚本本身是否已更改)和 if-modified-since 标头与资源的时间戳进行比较。
如果 if-modified-since 和 Etag 都匹配,则会向客户端传递 304 消息,脚本退出而无需重新生成整个页面。
当服务器收到客户端的请求时,会批量传递 HTTP 响应标头。
服务器通常会以响应标头和响应正文进行响应。
每个报头字段由 CRLF ([CR][LF]) 字符分隔。
也就是说,一个回车和一个换行。
知道这一点,我们就可以解析响应的标头部分。
响应标头可能如下所示:
HTTP/1.1 200 OK Date: Fri, 24 Nov 2015 15:30:20 GMT Server: Apache/2.4.18 (Ubuntu) Cache-Control: must-revalidate Last-Modified: Thu, 20 Nov 2015 10:22:03 GMT Expires: -1 Vary: Accept-Encoding Transfer-Encoding: chunked Content-Type: text/html; charset=utf-8
响应头部分包含多个响应消息,这些消息可以被客户端(例如 Web 浏览器)理解。
要发送单个响应消息,我们可以使用服务器端编程语言,例如 PHP。
<?php header('HTTP/1.1 200 OK'); //Always output headers before content //Content --->>>
其他语言可能有类似的方式来发送标头。