当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《带有HEAD请求的Content-Length标头?》经验,为你挑选了5个好方法。

在HTTP规范说的有关HEAD要求:

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

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



1> Paul Dixon..:

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

那里没有内容长度.


值得注意的是,如果它是一个`Transfer-Encoding:chunked`响应,你也不会看到`Content-Length`.

2> nietaki..:

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

Content-Length实体头字段指示实体主体的大小,以十进制数量的OCTET发送给接收者,或者在HEAD方法的情况下,实体主体的大小已经发送到请求是GET.


`curl --head`表现得好于`curl -X HEAD`.
有趣的是,curl告诉你身体缺失......他们可能不会"知道"该方法在阅读回复时是HEAD并假设身体缺失.

3> Daniel Vassa..:

是的, 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



4> Michael Banz..:

W3C的HTTP规范指出:

如果新字段值指示缓存的实体与当前实体不同(如Content-Length的更改所示,...

哪个(对我来说)意味着它应该像在GET响应中那样保持"正确"值.



5> David Moles..:

与接受的答案相反,RFC 7231的第4.3.2节规定:

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

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

可以省略.

这甚至比Paul Dixon的答案中应该关注的那样简单:

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

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

推荐阅读
LEEstarmmmmm
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有