Re[2]: Зацикливание на редиректе
CoDDoC
coddoc на mail.ru
Пн Авг 7 06:01:39 UTC 2017
Спасибо.
Только Вы говорите об URI "/", а вопрос был об URL, точнее - о зацикливании, связанном с неправильной (ИМХО) интерпретацией в ngx переменной $host. Как она ДОЛЖНА обрабатываться - сказано в доке, что имеем ПО ФАКТУ - в моем примере.
Добавление опции -v, по сути, ничего не меняет. Разве что лишний раз убедиться, что при редиректе передается заголовок HOST.
Тема уже поднималась, в частности, здесь ( http://mailman.nginx.org/pipermail/nginx-ru/2014-June/054083.html ) довольно обширная дискуссия. Но там все достаточно просто, речь идет о явно невалидных запросах, которые можно и нужно фильтровать. Я же несколько усложнил задачу и привел пример псевдо-валидного запроса, который отфильтровать невозможно.
И до тех пор, пока проблема с переменной $host не будет решена, такое зацикливание неизбежно.
Так что вопрос больше к разработчикам.
>Суббота, 5 августа 2017, 21:46 +03:00 от Валентин Бартенев < vbart на 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
----------- следущая часть -----------
Вложение в формате HTML было извлечено…
URL: <http://mailman.nginx.org/pipermail/nginx-ru/attachments/20170807/e8ce9992/attachment.html>
Подробная информация о списке рассылки nginx-ru