Спасибо.

Только Вы говорите об URI "/", а вопрос был об URL, точнее - о зацикливании, 
связанном с неправильной (ИМХО) интерпретацией в ngx переменной $host. Как она 
ДОЛЖНА обрабатываться - сказано в доке, что имеем ПО ФАКТУ - в моем примере.
Добавление опции -v, по сути, ничего не меняет. Разве что лишний раз убедиться, 
что при редиректе передается заголовок HOST.

Тема уже поднималась, в частности, здесь (  
http://mailman.nginx.org/pipermail/nginx-ru/2014-June/054083.html ) довольно 
обширная дискуссия. Но там все достаточно просто, речь идет о явно невалидных 
запросах, которые можно и нужно фильтровать. Я же несколько усложнил задачу и 
привел пример псевдо-валидного запроса, который отфильтровать невозможно.
И до тех пор, пока проблема с переменной $host не будет решена, такое 
зацикливание неизбежно.
Так что вопрос больше к разработчикам.


>Суббота,  5 августа 2017, 21:46 +03:00 от Валентин Бартенев < vb...@nginx.com 
>>:
>
>On Thursday 03 August 2017 12:15:16 CoDDoC wrote:
>[..]
>> Судя по логам, это не совсем так.
>> По крайней мере, в моем случае (nginx/1.10.2), переменная $host получает имя 
>> хоста из строки запроса только если не указано поле host заголовка. Т.е. 
>> обрабатывается ситуация с HTTP/1.0, без $http_host в заголовке. Но если в 
>> заголовке задать какое-то (любое) значение $http_host, это же значение 
>> получает и $host.
>> 
>> Далее ( http://nginx.org/ru/docs/http/request_processing.html ): nginx 
>> "сопоставляет значение поля Host заголовка запроса с директивами server_name 
>> в блоках server, которые соответствуют IP-адресу и порту". Т.е. все-таки 
>> $http_host. А туда можно прописать что угодно.
>> Я не рассматриваю сейчас ситуацию, когда в $http_host прописано имя, не 
>> совпадающее с перечисленными в server_name. Это все благополучно фильтруется 
>> и отправляется на 444. Также, я не рассматриваю браузеры, которые отправляют 
>> правильный $http_host и получают правильные редиректы.
>> 
>> Вот такой случай:
>> curl -ILH 'Host:  www.test.com '  https://test.com
>> 
>> Если бы переменная $host получила значение в порядке приоритета, оно было бы 
>> test.com (имя хоста из строки запроса). Тогда можно было бы реализовать 
>> такой костыль, как фильтрация по условию "$host не равно $http_host". Но в 
>> запросе присутствует заголовок host, и обе переменные $host и $http_host 
>> получают одно и то же значение  www.test.com , отфильтровать невозможно.
>
>
>
>Вы видимо ошибочно считаете, что данная команда curl в качестве строки запроса
>передает " https://test.com ".
>
>Нет, curl в данном случае в строке запроса передает "/".
>
>Чтобы увидеть, что конкретно посылает curl на сервер, можно добавить опцию 
>"-v".
>
>--
>Валентин Бартенев
>_______________________________________________
>nginx-ru mailing list
>nginx-ru@nginx.org
>http://mailman.nginx.org/mailman/listinfo/nginx-ru

_______________________________________________
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Ответить