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