Re: Зацикливание на редиректе

Валентин Бартенев vbart на nginx.com
Пн Авг 7 13:12:23 UTC 2017


On Monday 07 August 2017 15:26:11 CoDDoC wrote:
> Ну, хорошо. Пусть в моем примере вообще нет хоста.
> Тогда что такое  https://test.com ? Давайте назовем строкой запроса, суть 
проблемы от этого не меняется.

В вашем примере это аргумент командной строки, который не участвует в запросе.
В строке запроса он не передается.


> В документации так:
> " $host
>             в порядке приоритета: имя хоста из строки запроса, или имя хоста 
из поля “Host” заголовка запроса.....,"
> 
> Объясните мне, пожалуйста, что понимать как "имя хоста из строки запроса" и 
"имя хоста из поля “Host” заголовка запроса".
> Желательно с примером для курла, как особо одаренному.

Что такое строка запроса описано в RFC:
https://tools.ietf.org/html/rfc7230#section-3.1.1

Пример с curl:

$ curl -ILH 'Host: www.nginx.org' -x http://nginx.org:80/  http://nginx.org/


> 
> Далее, Вы приводите пример с netcat. Аналогично можно использовать telnet.
> Только ведь после получения Location ему нужно следовать. Полученный 
Location:  http://nginx.org/ куда возвращает? На HEAD  http://nginx.org/ 
HTTP/1.1.

Первый пример netcat как раз содержит http://nginx.org/ в строке запроса
и как вы можете наблюдать - редиректа нет.

Второй пример не содержит в строке запроса хоста, а в заголовке Host
содержится www.nginx.org и происходит редирект.


> 
> То же самое, только не вводить построчно:
> 
> curl -ILH 'Host: www.nginx.org'  https://nginx.org/  
> 
> И точно такое же зацикливание.

В данном случае отправляет запрос только с www.nginx.org в заголовке Host
и отсутствием хоста в строке запроса.  Так работает curl.

Зацикливания происходит только потому, что вы сами заставили curl
постоянно отправлять запрос с Host: www.nginx.org, о чем предупреждает
документация:


man curl:

       -H, --header <header>

              WARNING: headers set with this option will be set in
              all requests - even after  redirects  are  followed,
              like when told with -L, --location. This can lead to
              the header being sent to other hosts than the origi‐
              nal  host,  so sensitive headers should be used with
              caution combined with following redirects.



Если вы укажите заголовок Host так, как это правильно для curl,
то никаких проблем нет:

 curl -IL https://www.nginx.org/ 


> Пусть мои примеры неверны. Но работают, и приводят к зацикливанию при 
псевдо-валидном запросе.

Ваши примеры демонстрируют неправильное использование команды curl,
о чем вас предупреждает документация.

> По большому счету, меня интересует только, как это побороть.
> 

Использовать curl правильно.

--
Валентин Бартенев


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