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