Подтвердить что ты не робот

Заголовок Content-Length с запросами HEAD?

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

Приложения СЛЕДУЕТ использовать это поле для указать длину передачи тело сообщения, если это не запрещено правилами в разделе 4.4.

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

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

Таким образом, вы не всегда можете видеть Content-Length. Обычно вы можете не видеть его для любого контента, который динамически генерируется, поскольку это может быть слишком дорого для обслуживания поискового запроса HEAD. Например, запрос HEAD для Apache для статического файла будет содержать Content-Length, но запрос для PHP script может не быть.

Например, попробуйте этот веб-сайт...

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

Нет содержания.

Ответ 3

Да, Content-Length ответа HEAD СЛЕДУЕТ, но не всегда (см. @Paul answer), включают 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

Ответ 4

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

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

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

Ответ 5

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

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

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

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

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

  1. MAY Это слово или прилагательное "ДОПОЛНИТЕЛЬНОЕ" означает, что элемент действительно факультативно. Один поставщик может выбрать элемент, потому что конкретный рынок требует этого или потому, что продавец чувствует, что он улучшает продукт, в то время как другой поставщик может опустить тот же элемент.

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