首页 文章

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

提问于
浏览
59

http specHEAD 请求:

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

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

5 回答

  • 13

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

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

  • 4

    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
    

    那里没有内容长度 .

  • 8

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

    HTTP-spec at W3C州:

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

    哪个(对我来说)意味着它应该保持"correct"值,就像 GET 响应一样 .

  • 41

    与接受的答案相反,section 4.3.2 of RFC 7231指出:

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

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

    可以省略 .

    这是even weaker,而不是_1752663中的关于SHOULD的注释:

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

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

相关问题