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 mailing list [email protected] http://mailman.nginx.org/mailman/listinfo/nginx-ru
