带有HEAD请求的Content-Length标头?

时间:2010-10-04 11:35:13

标签: http rest http-headers

http spec说明了HEAD请求:

  

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

HEAD请求的响应是否应包含Content-Length标头?即使没有响应机构,它应该是GET请求返回的值吗?或者Content-Length应该是0?

5 个答案:

答案 0 :(得分:42)

Section 14.13 of the HTTP/1.1 spec详细说明了Content-Length标题,并说明了这一点:

  

应用程序应该使用此字段   表示转移的长度   消息体,除非是这样   本节规则禁止的   4.4。

'SHOULD'这个词有very specific meaning in RFCs

  
      
  1. 应该这个词,或形容词“推荐”,意味着在特定情况下可能存在忽略特定项目的正当理由,但在选择不同的课程之前必须理解并仔细权衡全部含义。
  2.   

因此,您可能并不总是看到内容长度。通常,您可能看不到任何动态生成的内容,因为这可能太昂贵而无法为探索性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

那里没有内容长度。

答案 1 :(得分:41)

对我来说,HTTP 1.1 RFC看起来非常具体:

  

内容长度   entity-header字段以十进制表示实体主体的大小   发送给收件人的OCTET数量,或者HEAD的数量   方法,本已发送的实体主体的大小   请求是GET

答案 2 :(得分:13)

是的,Content-Length回复的HEAD 应该,但并非总是如此(请参阅@Paul's answer)包含Content-Length的值{1}} 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

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

答案 3 :(得分:8)

HTTP-spec at W3C州:

  

如果新字段值表明缓存的实体与当前实体不同(如内容长度的变化所示,......

其中(对我来说)意味着它应该像GET响应一样保持“正确”值。

答案 4 :(得分:5)

反对接受的答案,section 4.3.2 of RFC 7231陈述:

  

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

- 也就是说,Content-Length,Content-Range,Trailer和Transfer-Encoding -

  

可以省略。

even weakerPaul Dixon's answer中应该注意的那样是http://alvinalexander.com/scala/union-intersection-difference-scala-sets

  
      
  1. MAY这个词,或形容词&#34; OPTIONAL&#34;,表示一个项目是   真的可选。一个供应商可能会选择包含该项目,因为a   特定市场需要它或因为供应商感觉到   它增强了产品,而另一个供应商可能会省略相同的项目。
  2.   

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