Заголовок Content-Length с запросами HEAD? - PullRequest
61 голосов
/ 04 октября 2010

http spec говорит о запросе HEAD:

Метод HEAD идентичен GET, за исключением того, что сервер НЕ ДОЛЖЕН возвращать тело сообщения в ответе,Метаинформация, содержащаяся в заголовках HTTP в ответ на запрос HEAD, ДОЛЖНА быть идентична информации, отправленной в ответ на запрос GET.

Если ответ на запрос HEAD содержит Content-Lengthзаголовок?Должно ли это быть значение, которое будет возвращено в запросе GET, даже если тела ответа нет?Или Content-Length должен быть 0?

Ответы [ 5 ]

42 голосов
/ 21 сентября 2013

Мне кажется, что HTTP 1.1 RFC довольно специфично:

Длина содержимого Поле заголовка объекта указывает размер тела объекта в десятичном виде количество OCTET, отправленных получателю или, в случае HEAD метод, размер тела объекта, который был бы отправлен запрос был получен .

42 голосов
/ 04 октября 2010

Раздел 14.13 спецификации HTTP / 1.1 подробно описывает заголовок Content-Length и говорит следующее:

Приложения ДОЛЖНЫ использовать это поле для указания длины передачиТело сообщения, если только это не запрещено правилами в разделе 4.4.

Слово «СЛЕДУЕТ» имеет очень специфическое значение в RFC :

ДОЛЖНО Это слово или прилагательное "РЕКОМЕНДУЕМЫЕ" означают, что могут существовать веские причины в определенных обстоятельствах игнорировать конкретный предмет, но все значения должны быть поняты и тщательно взвешены перед выбором другого курса.1015 *

Таким образом, вы не всегда можете видеть длину содержимого.Как правило, вы не можете увидеть его для любого контента, который генерируется динамически, поскольку это может быть слишком дорого для обслуживания исследовательского запроса HEAD.Например, запрос HEAD к Apache для статического файла будет иметь 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

Контентная длина отсутствует.

13 голосов
/ 04 октября 2010

Да, Content-Length ответа HEAD ДОЛЖЕН , но не всегда (см. @ ответ Павла ) включает значение Content-Length GET ответ:

Переполнение стека:

> 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
8 голосов
/ 04 октября 2010

HTTP-спецификация в W3C гласит:

Если новые значения поля указывают, что кэшированный объект отличается от текущего объекта (как было бы указано при измененииContent-Length, ...

Что (для меня) означает, что оно должно содержать "правильное" значение, как в ответе GET.

5 голосов
/ 11 февраля 2017

Против принятого ответа, в разделе 4.3.2 RFC 7231 говорится:

Серверу СЛЕДУЕТ посылать те же поля заголовка в ответ на запрос HEAD, как это было быотправляется, если запрос был GET, за исключением того, что поля заголовка полезной нагрузки (раздел 3.3)

, то есть Content-Length, Content-Range, Trailer и Transfer-Encoding—

МОЖЕТ быть опущено.

Это даже слабее , чем примечание СЛЕДУЕТ в ответ Пола Диксона :

МОЖЕТ Это слово, или прилагательное «ДОПОЛНИТЕЛЬНО», означает, что предмет действительно необязателен.Один продавец может включить товар, потому что он требуется конкретному рынку или потому что продавец чувствует, что он улучшает продукт, в то время как другой продавец может опустить тот же товар.

Таким образом, реальный ответ таков:вам не нужно включать Content-Length, но если вы это сделаете, вы должны указать правильное значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...