Заголовок Content-Length с запросами HEAD?
The http spec говорит о HEAD запрос:
метод HEAD идентичен методу GET, за исключением того, что сервер не должен возвращать тело сообщения в ответе. Метаинформация, содержащаяся в заголовках HTTP в ответ на запрос HEAD, должна быть идентична информации, отправленной в ответ на запрос GET.
если ответ HEAD запрос содержит Content-Length заголовок? Это должно быть значение, которое будет вернулся на GET запрос, даже если нет ответа? Или длина содержимого должна быть 0?
5 ответов:
для меня это выглядит как HTTP 1.1 RFC это видео:
Контент-Длина поле entity-header указывает размер тела Сущности в десятичном формате количество октетов, отправленных получателю или,в случае, если глава метод, размер сущности-тела, которое было бы отправлено, имел запрос был получить.
раздел 14.13 HTTP / 1.1 спецификация подробно заголовок Content-Length, и говорит это:
приложения должны использовать это поле для укажите длину передачи тело сообщения, если это запрещено правилами в разделе 4.4.
слово "должен" имеет очень специфическое значение в RFC:
- должно ли это слово или прилагательное "рекомендуется" означать, что там могут существовать веские причины в конкретных обстоятельствах игнорировать конкретный пункт, но полные последствия должны быть поняты и тщательно взвешены, прежде чем выбрать другой курс.
таким образом, Вы не всегда можете видеть длину содержимого. Как правило, вы можете не видеть его для любого содержимого, которое генерируется динамически, так как это может быть слишком дорого для обслуживания запроса 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-
может быть опущен.
Это даже слабее чем Примечание На должно в ответ пола Диксона:
- может ли это слово или прилагательное "необязательный" означать, что элемент является действительно необязательно. Один продавец может выбрать пункт, потому что конкретный рынок требует этого или потому, что поставщик чувствует, что это улучшает продукт, в то время как другой поставщик может опустить тот же элемент.
Так что реальный ответ, вам не нужно включать Content-Length, но если вы это сделаете, вы должны дать правильное значение.
Comments