LINUX.ORG.RU
решено ФорумAdmin

Непонятный редирект в Nginx

 ,


0

1

Окей, лорогугл «Почему Nginx делает редирект да ещё и на внутренний порт»?
Вводные:
nginx.conf

  server {
           listen       1234 ssl;
           server_name  mysweetsupersite.ru;

           location /testapp {
             root   /home/vasyan/apps/;
             index  index.html index.htm;
             try_files $uri $uri/ /;
           }
...

Порт 1234 заNATен на 443
Файлы сайта лежат в /home/vasyan/apps/testapp

Вопрос:
если пойти на https://mysweetsupersite.ru/testapp/ то всё ок
если пойти на https://mysweetsupersite.ru/testapp то Nginx отвечает
< HTTP/1.1 301 Moved Permanently
< Location: https://mysweetsupersite.ru:1234/testapp/

(проверяю curl'ом)

Почему так?

★★★★★

Nginx делает такой редирект, потому что /testapp - это директория, а не файл. Если не хочешь такой редирект конкретно для этого запроса - добавь локацию location = /testapp.

Ну, а на внутренний порт - так откуда nginx про внешний порт узнает? Тут разные варианты решения есть; проблема будет для всех редиректов за авторством nginx'а.

tiandrey ★★★★★
()
Последнее исправление: tiandrey (всего исправлений: 3)
Ответ на: комментарий от cyclon

cyclon
Без try_files результат тот же

tiandrey
Зачем ему вообще порт, почему не делать это относительно server_name или значения заголовка Host?

zolden ★★★★★
() автор топика
Ответ на: комментарий от Deleted

Круто, спасибо, то что надо.

zolden ★★★★★
() автор топика
Ответ на: комментарий от zolden

Это абсолютный редирект, поэтому там и хостнейм, и порт участвуют. Один и тот же nginx может обслуживать один и тот же домен на нескольких портах с разной семантикой, и при абсолютном редиректе без порта может получиться совсем не то, что нужно.

Про port_in_redirect тебе уже ответили. Есть ещё вариант выключить absolute_redirect, тогда просто будут относительные редиректы.

Почему по умолчанию абсолютные, а не относительные редиректы - не знаю.

tiandrey ★★★★★
()
Ответ на: комментарий от tiandrey

Спасибо за детальное объяснение.
А какой самый простой способ будет чтобы на
/testapp и /testapp/ всегда открывался индексный файл?
Я предполагал что try_files $uri/ приведёт к этому

zolden ★★★★★
() автор топика
Ответ на: комментарий от zolden

Я убил на это час, но наконец-то понял, почему всё так, а не иначе.

Итак, почему эта конфигурация не работает так, как ты хочешь:

  • index обрабатывает только те запросы, которые оканчиваются на /
  • try_files проверяет наличие указанных файлов/директорий, если находит - отдаёт, при этом uri не переписывается, всё обрабатывается в контексте текущей локации
  • try_files $uri $uri/ /; - проверяет наличие такого файла или такой директории. Если nginx отдаёт ресурс, являющийся директорией, а uri не оканчивается на слеш, то index не включается в работу, и nginx отдаёт редирект на uri директории + слеш в конце.
  • $uri для try_files это проверка существования файла, а $uri/ - проверка существования директории (да в принципе любая строка, которая не оканчивается на слеш до раскрытия переменных - это проверка на файл, а которая оканчивается - проверка на директорию)
  • поведение, которое ты хочешь, достигается таким конфигом:
               location /testapp {
                 root   /home/vasyan/apps/;
                 try_files $uri $uri/index.html $uri/index.htm /;
               }
    
    т.е. логику index надо в try_files засунуть.
tiandrey ★★★★★
()
Последнее исправление: tiandrey (всего исправлений: 3)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.