http spec说 HEAD 请求:
HEAD
HEAD方法与GET相同,只是服务器不能在响应中返回消息体 . 响应HEAD请求的HTTP头中包含的元信息应该与响应GET请求时发送的信息相同 .
对 HEAD 请求的响应是否包含 Content-Length 标头?它应该是 GET 请求返回的值,即使没有响应体吗?或者Content-Length应该为0?
Content-Length
GET
对我而言,HTTP 1.1 RFC看起来非常具体:
Content-Length entity-header字段指示实体主体的大小,以十进制数量的OCTET发送给接收者,或者在HEAD方法的情况下,指示将被发送的实体主体的大小 . 请求是GET .
Section 14.13 of the HTTP/1.1 spec详细说明了Content-Length Headers ,并说明了这一点:
应用程序应该使用此字段来指示消息正文的传输长度,除非4.4节中的规则禁止这样做 .
'SHOULD'这个词有very specific meaning in RFCs:
应该这个词,或形容词“推荐”,意味着在特定情况下可能存在忽略特定项目的正当理由,但在选择不同的课程之前必须理解并仔细权衡其全部含义 .
因此,您可能并不总是看到内容长度 . 通常,您可能看不到任何动态生成的内容,因为这可能太昂贵而无法为探索性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
那里没有内容长度 .
是的, HEAD 响应 SHOULD ,但并非总是如此(参见@Paul's answer)包含 GET 响应的 Content-Length 值:
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
HTTP-spec at W3C州:
如果新字段值指示缓存的实体与当前实体不同(如Content-Length的更改所示,...
哪个(对我来说)意味着它应该保持"correct"值,就像 GET 响应一样 .
与接受的答案相反,section 4.3.2 of RFC 7231指出:
服务器应该发送相同的头字段以响应HEAD请求,如果请求是GET,它将发送,除了有效负载头字段(第3.3节)
可以省略 .
这是even weaker,而不是_1752663中的关于SHOULD的注释:
MAY这个词,或形容词“OPTIONAL”,意味着一个项目是真正可选的 . 一个供应商可能会选择包含该项目,因为特定的市场需要它,或者因为供应商认为它增强了产品,而另一个供应商可能会省略相同的项目 .
所以真正的答案是,你不需要包含Content-Length,但如果你这样做,你应该给出正确的值 .
5 回答
对我而言,HTTP 1.1 RFC看起来非常具体:
Section 14.13 of the HTTP/1.1 spec详细说明了Content-Length Headers ,并说明了这一点:
'SHOULD'这个词有very specific meaning in RFCs:
因此,您可能并不总是看到内容长度 . 通常,您可能看不到任何动态生成的内容,因为这可能太昂贵而无法为探索性HEAD请求提供服务 . 例如,对Apache的HEAD请求静态文件将具有Content-Length,但是对PHP脚本的请求可能不会 .
例如,试试这个网站......
那里没有内容长度 .
是的,
HEAD
响应 SHOULD ,但并非总是如此(参见@Paul's answer)包含GET
响应的Content-Length
值:Stack Overflow确实:
谷歌没有:
HTTP-spec at W3C州:
哪个(对我来说)意味着它应该保持"correct"值,就像
GET
响应一样 .与接受的答案相反,section 4.3.2 of RFC 7231指出:
这是even weaker,而不是_1752663中的关于SHOULD的注释:
所以真正的答案是,你不需要包含Content-Length,但如果你这样做,你应该给出正确的值 .