在HTTP规范说的有关HEAD
要求:
HEAD方法与GET相同,只是服务器不能在响应中返回消息体.响应HEAD请求的HTTP头中包含的元信息应该与响应GET请求时发送的信息相同.
HEAD
请求的响应是否应包含Content-Length
标题?GET
即使没有响应机构,它应该是在请求中返回的值吗?或者Content-Length应该为0?
HTTP/1.1规范的第14.13节详细介绍了Content-Length标头,并说明了这一点:
应用程序应该使用此字段来指示消息正文的传输长度,除非4.4节中的规则禁止这样做.
"SHOULD"这个词在RFC中具有非常特殊的含义:
应该这个词,或形容词"推荐",意味着在特定情况下可能存在忽略特定项目的正当理由,但在选择不同的课程之前必须理解并仔细权衡全部含义.
因此,您可能并不总是看到内容长度.通常,您可能看不到任何动态生成的内容,因为这可能太昂贵而无法为探索性HEAD请求提供服务.例如,对Apache的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
那里没有内容长度.
对我来说,看起来HTTP 1.1 RFC非常具体:
Content-Length实体头字段指示实体主体的大小,以十进制数量的OCTET发送给接收者,或者在HEAD方法的情况下,实体主体的大小已经发送到请求是GET.
是的, Content-Length
一个的HEAD
响应应该,但并不总是没有(见@保罗的回答)包括Content-Length
一个价值GET
响应:
Stack Overflow确实:
> 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
谷歌没有:
> 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规范指出:
如果新字段值指示缓存的实体与当前实体不同(如Content-Length的更改所示,...
哪个(对我来说)意味着它应该像在GET
响应中那样保持"正确"值.
与接受的答案相反,RFC 7231的第4.3.2节规定:
服务器应该发送相同的头字段以响应HEAD请求,如果请求是GET,它将发送,除了有效负载头字段(第3.3节)
- 也就是说,Content-Length,Content-Range,Trailer和Transfer-Encoding-
可以省略.
这甚至比Paul Dixon的答案中应该关注的那样简单:
可以这个词,或形容词"可选",意味着一个项目是真正可选的.一个供应商可能会选择包含该项目,因为特定的市场需要它,或者因为供应商认为它增强了产品,而另一个供应商可能会省略相同的项目.
所以真正的答案是,你不需要包含Content-Length,但如果你这样做,你应该给出正确的值.