Nginx-ru mailing list archive (nginx-ru@sysoev.ru)
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
nginx и RFC
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 mailing list
nginx-ru@xxxxxxxxx
http://mailman.nginx.org/mailman/listinfo/nginx-ru
|