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



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




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




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

712   5  

5 ответов:

для меня это выглядит как HTTP 1.1 RFC это видео:

Контент-Длина поле entity-header указывает размер тела Сущности в десятичном формате количество октетов, отправленных получателю или,в случае, если глава метод, размер сущности-тела, которое было бы отправлено, имел запрос был получить.

раздел 14.13 HTTP / 1.1 спецификация подробно заголовок Content-Length, и говорит это:

приложения должны использовать это поле для укажите длину передачи тело сообщения, если это запрещено правилами в разделе 4.4.

слово "должен" имеет очень специфическое значение в RFC:

  1. должно ли это слово или прилагательное "рекомендуется" означать, что там могут существовать веские причины в конкретных обстоятельствах игнорировать конкретный пункт, но полные последствия должны быть поняты и тщательно взвешены, прежде чем выбрать другой курс.

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

там нет длины содержимого.

да Content-Length на HEAD ответ должны, но не всегда (см. @Павел!--10-->) включает 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

на HTTP-spec на W3C гласит:

если новые значения полей указывают на то, что кэшированная сущность отличается от текущей сущности (как было бы указано изменением длины содержимого,...

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

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

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

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

может быть опущен.

Это даже слабее чем Примечание На должно в ответ пола Диксона:

  1. может ли это слово или прилагательное "необязательный" означать, что элемент является действительно необязательно. Один продавец может выбрать пункт, потому что конкретный рынок требует этого или потому, что поставщик чувствует, что это улучшает продукт, в то время как другой поставщик может опустить тот же элемент.

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

Comments

    Ничего не найдено.