内容长度头与HEAD请求?

http规范说明了HEAD请求:

HEAD方法与GET相同,只是服务器不能在响应中返回消息体。 响应HEAD请求的HTTP头中包含的元信息应该与响应GET请求发送的信息相同。

应该对HEAD请求的响应是否包含一个Content-Length头部? 是否应该是GET请求返回的值,即使没有响应主体? 还是应该内容长度为0?

对我来说,它看起来像HTTP 1.1 RFC是非常具体的:

Content-Length实体标题字段表示发送给接收方的实体主体的大小,以十进制数表示的OCTET,或者在HEAD方法的情况下 ,发送的实体主体的大小该请求已成为GET

HTTP / 1.1规范的14.13节详细描述了Content-Length头,并且说:

应用程序应该使用这个字段来表示消息体的传输长度,除非4.4节中的规则禁止这样做。

RFC中的 “SHOULD”这个词具有非常明确的含义 :

  1. 应该这个词,或者是“推荐”这个形容词,意思是在特定的情况下可能存在一些无效的理由来忽略某个特定的项目,但是在select不同的课程之前,必须理解和仔细权衡全部的含义。

所以,你可能不会总是看到一个Content-Length。 通常情况下,对于dynamic生成的任何内容,您可能不会看到它,因为这可能太昂贵,无法服务探索性的HEAD请求。 例如,一个静态文件的HEAD请求有一个Content-Length,但是一个PHP脚本的请求可能不会。

例如,尝试这个网站…

 telnet stackoverflow.com 80 HEAD / HTTP/1.0 Host:stackoverflow.com HTTP/1.1 200 OK Date: Mon, 11 Jan 2016 10:58:25 GMT Content-Type: text/html; charset=utf-8 Connection: close Set-Cookie: __cfduid=c2eb4742a1e02d89cab0402220736c0bd1452509905; expires=Tue, 10-Jan-17 10:58:25 GMT; path=/; domain=.stackoverflow.com; HttpOnly Cache-Control: public, no-cache="Set-Cookie", max-age=36 Expires: Mon, 11 Jan 2016 10:59:02 GMT Last-Modified: Mon, 11 Jan 2016 10:58:02 GMT Vary: * X-Frame-Options: SAMEORIGIN X-Request-Guid: 487e80bc-3783-4cfd-d883-a3bc84253234 Set-Cookie: prov=8dc24306-c067-45eb-bf5d-cffa855c2b03; domain=.stackoverflow.com; expires=Fri, 01-Jan-2055 00:00:00 GMT; path=/; HttpOnly Server: cloudflare-nginx CF-RAY: 26303c15f8e035a2-LHR 

那里没有内容。

是的, HEAD响应的Content-Length 应该 ,但并不总是(请参阅@ Paul的答案 )包含GET响应的Content-Length值:

堆栈溢出确实:

 > telnet stackoverflow.com 80 HEAD / HTTP/1.1 Host: stackoverflow.com HTTP/1.1 200 OK Cache-Control: public, max-age=60 Content-Length: 362245 <-------- Content-Type: text/html; charset=utf-8 Expires: Mon, 04 Oct 2010 11:51:49 GMT Last-Modified: Mon, 04 Oct 2010 11:50:49 GMT Vary: * Date: Mon, 04 Oct 2010 11:50:49 GMT 

Google不会:

 > telnet www.google.com 80 HEAD / HTTP/1.1 Host: www.google.ie HTTP/1.1 200 OK Date: Mon, 04 Oct 2010 11:55:36 GMT Expires: -1 Cache-Control: private, max-age=0 Content-Type: text/html; charset=ISO-8859-1 Server: gws X-XSS-Protection: 1; mode=block Transfer-Encoding: chunked 

W3C的HTTP规范指出:

如果新字段值指示caching的实体与当前实体不同(如将通过内容长度的改变所指示的那样,…

哪一个(对我来说)意味着它应该保持“正确”的值,就像你在GET响应中一样。

对接受的答案, RFC 7231第4.3.2节规定:

服务器应该发送相同的头字段来响应HEAD请求,如果请求是GET的话,它将发送,除了有效载荷头字段(见3.3节)

也就是说,内容长度,内容范围,预告片和传输编码 –

可以省略。

这甚至比Paul Dixon的答案中的“ SHOULD”上的logging更弱 :

  1. 可能这个词,或形容词“可选”,意味着一个项目是真正的可选的。 一个供应商可能会select包含该项目,因为特定的市场需要它,或者因为供应商认为它增强了产品,而另一个供应商可能省略相同的项目。

所以真正的答案是,你不需要包含Content-Length,但是如果你这样做,你应该给出正确的值。