nginx BUG ? unexpected redirect from https://example.com/download to https://example.com/download/

Gena Makhomed gmm на csdoc.com
Ср Дек 15 14:15:29 UTC 2021


Здравствуйте, Максим!

On 15.12.2021 15:39, Maxim Dounin wrote:

>>> Воспроизводится ли проблема на приведённом конфиге в чистом виде,
>>> без каких-либо других location'ов и/или rewrite'ов?  Если да 
>>> - то как выглядит минимальный конфиг, на котором проблема
>>> воспроизводится, полностью (nginx -T)?
>>
>> Воспроизводится на таком конфиге:
>>
>> error_log /var/log/nginx/error.log debug;
>> events { use epoll; }
>> http {
>>       server {
>>           server_name example.com;
>>           location / { proxy_pass http://127.0.0.1; }
>>           location /download/ { proxy_pass http://127.0.0.2; }
>>       }
>> }
> 
> На таком конфиге - воспроизводиться должно, это штатное поведение.
> Явно документировано в описании директивы location

Теперь понял, большое спасибо! Не дочитал документацию, после слов
"Проиллюстрируем вышесказанное примером" дальше уже читать не стал,
а после него оказывается еще есть описание поведения директивы...

> Вопрос исключительно о том, почему, как утверждается в исходном
> сообщении, не срабатывает явно заданный location без завершающего
> слэша, в том числе с точным совпадением.

Это особенности моей локальной конфигурации. На сервере есть
два контейнера, nginx-frontend и nginx-backend, запрос идет так:
client => nginx-frontend => nginx-backend => proxy_pass http://app

В контейнере nginx-frontend есть два сайта - example.com
и dev.example.com, оба они закрыты с помощью basic_auth:

     location / {
         auth_basic "Site under development";
         auth_basic_user_file /etc/nginx/safe/example.com.htpasswd;
         satisfy any;
         allow 11.22.33.44; # мой IP адрес
         deny all;
         proxy_pass http://nginx-backend;
     }

но для сайта example.com в конфигурации nginx-frontend
есть строчка location /download/ { proxy_pass http://nginx-backend; }
чтобы файлы можно было скачивать из интернета без ввода логина и пароля,
а в конфиге для сайта dev.example.com такой строчки нет.

При этом в контейнере nginx-backend конфигурации сайтов example.com
и dev.example.com идентичны между собой и отличаются только адресом
куда проксируются запросы через proxy_pass. Про эту строчку
в конфигурации nginx-frontend я уже и забыл, поэтому и сделал
ошибочное предположение, что nginx-backend по разному обрабатывает
конфигурацию в зависимости от того куда указывает proxy_pass,
потому что для сайта dev.example.com урл /download уходил
на proxy_pass а для example.com был 301 редирект.
В будущем постараюсь быть более внимательным.

-- 
Best regards,
  Gena


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