Re: Документация к директиве fastcgi_cache_key

Maxim Dounin mdounin на mdounin.ru
Чт Ноя 29 19:02:57 UTC 2018


Hello!

On Thu, Nov 29, 2018 at 08:35:18PM +0200, Gena Makhomed wrote:

> On 29.11.2018 18:30, Maxim Dounin wrote:
> 
> >> В документации к директиве fastcgi_cache_key приведен такой пример:
> >>
> >>          fastcgi_cache_key localhost:9000$request_uri;
> >>
> >> У этого примера есть несколько проблем:
> >>
> >> 1. Если кто-то сделает к бекенду HEAD-запрос, то в кеш запишется пустой
> >> ответ и на последующие GET-запросы будет отдаваться пустая страница.
> 
> > AFAIK, никакой специальной обработки HEAD-запросов в FastCGI не
> > предусмотрено.  И в том числе не предсмотрено в каком-нибудь PHP
> > из коробки.  Соответственно всё будет работать штатно.
> 
> Специальная обработка HEAD-запросов предусмотрена в HTTP протоколе:
> https://tools.ietf.org/html/rfc7231#section-4.3.2
> 
>     The HEAD method is identical to GET except that the server MUST NOT
>     send a message body in the response (i.e., the response terminates at
>     the end of the header section).
> 
> В nginx присутствует workaround, который исправляет поведение бекендов,
> которые на HEAD-запрос *ошибочно* отвечают так же, как и на GET-запрос.
> 
> Но далеко не все бекенды содержат в себе эту ошибку, многие из них ведут
> себя именно так, как этого от них требует спецификация HTTP протокола.

CGI и HTTP - это два разных протокола.  В последних вариациях на 
тему спецификации CGI записано, что на HEAD-запросы тело 
возвращать не надо (а если вдруг вернули - то сервер его должен 
поскипать), https://tools.ietf.org/html/rfc3875#section-4.3.3:

   The HEAD method requests the script to do sufficient processing to
   return the response header fields, without providing a response
   message-body.  The script MUST NOT provide a response message-body
   for a HEAD request.  If it does, then the server MUST discard the
   message-body when reading the response from the script.

Однако на момент собственно появления и активного распространения 
CGI никаких подобных требований не существовало, см.  
https://www.w3.org/CGI/ и в частности
https://tools.ietf.org/html/draft-robinson-www-interface-00.  И на 
практике я не встречал скрипты, которые бы отдельно обрабатывали 
HEAD-запросы.

> > Речь про какие-то фреймворки, которые обрабатывают
> > HEAD автоматически, не донося соответствующую информацию до кода?
> > Или про какой-то стандартный софт, который не возвращает тело для
> > HEAD-запросов?
> 
> Какая разница, сам софт или фрейморк используемый софтом в каждом
> конкретном случае обрабатывает HEAD запросы согласно требований RFC?

Никакой.  Но с этой точки зрения так же нет разницы, что именно 
написано в примерах в описании директивы fastcgi_cache_key.

[...]

-- 
Maxim Dounin
http://mdounin.ru/


Подробная информация о списке рассылки nginx-ru