需要什么HTTP响应标头

Ben*_*eni 60 http httpresponse http-headers

需要从服务器向客户端发送哪些HTTP响应头?

我正在努力优化HTTP响应头以最小化HTTP响应开销.我知道"开销"有点夸张,但我喜欢干净的输出.

我看到很多网站发送冗余缓存标头.

例如

它是多余的同时指定ExpiresCache-Control: max-age,或同时指定Last-ModifiedETag.

  • 资源
  • HTTP/1.1:标题字段定义

Why*_*rrh 57

这取决于您定义的所需内容:无论在什么情况下都没有必须与每个响应一起发送的头字段,但是您确实应该发送头字段.接近的唯一标题字段是Date,但即使它有不需要它的情况.

RFC 2119的说法中,术语必须意味着某些东西是规范的要求而不满足要求将是无效的.有由RFC中定义无头字段7230,7231,7232,7233,7234,或7235必须由原始服务器发送的所有情况.


例如,可以省略以下标题(尽管您可能应该发送它们):

7.1.1.2.日期

如果源服务器Date没有能够在协调世界时提供合理近似当前实例的时钟,则它必须不发送头字段.Date如果响应在1xx(信息)或5xx(服务器错误)类状态代码中,则源服务器可以发送头字段.原始服务器必须Date在所有其他情况下发送头字段.

注意引用的最后一句.该Date头字段必须如果原始服务器能够提供在UTC日期的"合理的近似度"的,但也只是从自身歪曲停止服务器发送.

7.4.2.服务器

源服务器可以Server在其响应中生成字段.

3.3.2.内容长度

除了[有限数量的预定义情况]之外,如果没有 Transfer-Encoding,原始服务器应该Content-Length 在发送完整标题部分之前知道有效负载主体大小时发送标题字段.

对主题Content-LengthTransfer-Encoding,请注意,既不可以被发送,在这种情况下,响应的长度"由八位字节的数目确定的接收之前在服务器关闭连接".

3.1.1.5.内容类型

如果Content-Type不存在标题字段,则接收方可以采用媒体类型application/octet-stream (RFC2046,第4.5.1节)或检查数据以确定其类型.


在某些情况下,可能需要特定的标头,例如:


Mar*_*ham 22

它取决于响应的具体情况,但通常来自原始服务器的响应应具有:

  • 日期
  • 内容类型
  • 服务器

和Content-Length,Transfer-Encoding或Connection:close.

如果要进行缓存,请添加Cache-Control(例如,使用max-age); 过期通常不再需要.如果您希望客户端能够验证,请添加Last-Modified或ETag.

  • 严格来说,它们都不是必需的; 如果您查看RFC2616(和httpbis docs),您会看到如果原始服务器没有时钟,则可以省略Date; content-type可以省略(默认为application/octet-stream),鼓励服务器,但不是必需的.这至少部分是因为我们需要在某种程度上向后兼容HTTP/0.9,它根本没有标头.但是,为了使响应有用,它确实需要一些. (24认同)
  • @algal当它来自一个规范编写者时,我认为没关系. (5认同)
  • 感谢您的回答!但是我不认为“服务器”标题很重要。避免此标头输入也是一点安全保护。攻击者没有诸如“ OS / Webserver / -version”之类的“任何”信息。 (2认同)
  • @Whymarrhtouché! (2认同)