从服务器发送到客户端需要什么 HTTP 响应头?
我致力于优化 HTTP 响应头,以最小化 HTTP 响应开销。我知道“开销”有点夸张,但我喜欢干净的输出。
我看到很多网站发送冗余的缓存头,等等..。
例如:。
同时指定 Expires和 Cache-Control: max-age或者同时指定 Last-Modified和 ETag是多余的。
Expires
Cache-Control: max-age
Last-Modified
ETag
这取决于响应的细节,但一般来说,来自原始服务器的响应应该具有:
以及内容长度、传输编码或连接: 关闭。
如果你想进行缓存,添加 Cache-Control (例如,使用 max-age) ; 通常不再需要过期。如果您希望客户端能够验证,添加最后修改或 ETag。
它取决于您所定义的必需内容: 没有必须随每个响应一起发送的头字段,无论情况如何,但是有一些头字段是您真正 应该发送的。唯一接近的头字段是 Date,但是即使在这种情况下也不需要它。
Date
用 RFC 2119的说法,术语 必须的意味着某些东西是规范的要求,不符合要求将是无效的。没有由原始服务器 无论如何发送的由 RFC 7230、 7231、 7232、 7233、 7234或 7235定义的头字段。
例如,可以省略下列标题(尽管您可能应该发送它们) :
如果原始服务器没有发送 Date头字段,那么它就不能发送 有一个时钟能够提供一个合理的近似 协调世界时中的当前实例。原始服务器可能 如果响应在1xx 中,则发送一个 Date头字段 (信息性)或5xx (服务器错误)类的状态代码 在所有其他情况下,原始服务器必须发送 Date头字段。
注意引文的最后一句。如果原始服务器能够提供以 UTC 表示的日期的“合理近似值”,则发送 Date头字段 必须的,但是没有什么能够阻止服务器误报自己。
原始服务器可以在其响应中生成 Server字段。
Server
除了[有限数量的预先定义的情况] ,在没有 原始服务器应该发送一个 Content-Length 属性之前已知有效负载体大小时,返回 完整的页眉部分。
Content-Length
关于 Content-Length和 Transfer-Encoding,请注意两者都不能发送,在这种情况下,响应的长度“由服务器关闭连接之前接收到的八位字节数决定”
Transfer-Encoding
如果不存在 Content-Type头字段,则收件人 可以假定媒体类型为 application/octet-stream (RFC2046,第4.5.1节)或检查数据以确定其类型。
Content-Type
application/octet-stream
在某些情况下,可能需要特定的标题,例如:
Connection: close
Allow
WWW-Authenticate