nginx и RFC

Gena Makhomed gmm at csdoc.com
Tue Jan 14 00:42:44 UTC 2014


On 10.01.2014 14:53, Валентин Бартенев wrote:

>>> Так, между делом, хочу напомнить, что на CGI есть спецификация,
>>> описывающая все переменные окружения, которые сервер должен передавать
>>> приложению. И в ней вполне черным по белому сказано, что все переменные
>>> HTTP_* это protocol specific переменные полученные
 >>> из заголовков переданных клиентом.

Проблема со спецификацией CGI/1.1 в том, что она была создана
в тот момент, когда существовал только протокол HTTP/1.0
А в протоколе HTTP/1.0 единственным источником имени хоста
является заголовок Host:, такого понятия как "absolute URI"
в протоколе HTTP/1.0 вообще не существует. Потому так и написано.

Когда спецификацию CGI/1.1 публиковали в виде RFC -
эту ошибку/неточность исправить забыли. Что и стало причиной
путаницы и этих недоразумений, поскольку спецификация CGI/1.1
предполагает, что все запросы от клиентов приходят на сервер
только по протоколу HTTP/1.0, а они оказывается теперь могут
приходить и по протоколу HTTP/1.1, где правила определения
имени виртуального хоста уже стали несколько другими.

В HTTP/1.0 переменная HTTP_HOST работала всегда нормально,
а в HTTP/1.1 этот механизм работает не всегда как ожидалось.

Вот все отличия между версиями HTTP/1.0 и HTTP/1.1:
http://tools.ietf.org/search/rfc2616#section-19.6.1

Кстати, там есть интересные требования:

       - Servers MUST report a 400 (Bad Request) error if an HTTP/1.1
         request does not include a Host request-header.

       - Servers MUST accept absolute URIs.

================================================================

Можно ли nginx исправить так, чтобы он передавал на backend
по FastCGI в переменной HTTP_HOST имя хоста, к которому клиент
сделал свой запрос вне зависимости от того, где оно было
задано в исходном запросе, - в заголовке Host: (протокол HTTP/1.0)
или в виде host part of the Request-URI (протокол HTTP/1.1) ?

Или для этого надо сначала исправить спецификацию CGI/1.1
и только потом можно будет этот BUG исправить и в nginx ?

================================================================

> Если заголовка Host в запросе вообще не будет, то и переменной HTTP_HOST
> быть также не должно.

Каким образом это согласуется с RFC 2616 ? Там ведь в section-19.6.1
черным по белому написано, что тогда сервер MUST возвращать 400 ошибку.

В 5.2 также требуется, что если пришел запрос и это is not a valid host
on the server, the response MUST be a 400 (Bad Request) error message.

Вот уже на ровном месте два случая, где nginx нарушает требования RFC.

Это как, нормально?

-- 
Best regards,
  Gena



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