Рейтинг:1

Nginx proxy_redirect с относительными путями

флаг gq

Я не большой специалист по администрированию nginx, я просто разработчик. У меня есть два бэкэнда, работающих в докере. Позвольте мне назвать их

  • бэкенд1:8080
  • бэкенд2:8081

Также у меня есть Nginx, открывающий порт 443 с установленным сертификатом letsencrypt. Моя конфигурация Nginx (полное доменное имя переменной env похоже на example.com)

восходящий бэкэнд1 {
  серверная часть 1:8080;
}

восходящий сервер2 {
  серверная часть2:8081;
}

сервер {
  слушать 443 ssl;
  
  server_name ${FQDN} www.${FQDN};
  
  ssl_certificate /etc/letsencrypt/live/${FQDN}/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/${FQDN}/privkey.pem;
  ssl_session_cache общий: SSL: 1 м;
  ssl_session_timeout 5 м;
  ssl_ciphers HIGH:!aNULL:!MD5;
  ssl_prefer_server_ciphers включен;

  если ($ server_port = 80) { установить $ https_redirect 1; }
  if ($host ~ '^www\.') { set $https_redirect 1; }
  если ($https_redirect = 1) { return 301 https://${FQDN}$request_uri; }
  
  местоположение /путь1/ {
    
    прокси_пасс http://backend1/;

    proxy_redirect ~^/(.*) $scheme://$http_host/path1/$1;
    
    прокси_http_версия 1.1;
    
    proxy_pass_header Set-Cookie;
    файл cookie proxy_pass_header;
    proxy_pass_header X-Forwarded-For;

    proxy_set_header Обновить $http_upgrade;
    proxy_set_header Соединение "обновление";
    proxy_set_header Хост $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forward-Proto http;
    proxy_set_header X-Nginx-Proxy true;
    add_header X-восходящий поток $upstream_addr;
  }
  
  местоположение /путь2/ {
    
    прокси_пасс http://backend2/;

    proxy_redirect ~^/(.*) $scheme://$http_host/path2/$1;
    
    прокси_http_версия 1.1;
    
    proxy_pass_header Set-Cookie;
    файл cookie proxy_pass_header;
    proxy_pass_header X-Forwarded-For;

    proxy_set_header Обновить $http_upgrade;
    proxy_set_header Соединение "обновление";
    proxy_set_header Хост $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forward-Proto http;
    proxy_set_header X-Nginx-Proxy true;
    add_header X-восходящий поток $upstream_addr;
  }
}

Я хочу этого, если я попрошу https://example.com/path1/ тогда Nginx должен перейти к http://бэкенд1:8080/ и верните мне ответ с этого сервера. Проблема в том, что backend1 (как и backend2) может ответить 302 и перенаправить на какой-то путь, например. /авторизоваться. Nginx перенаправляет мой браузер на https://example.com/логин но я хочу, чтобы он перенаправил меня на https://example.com/path1/логин Не могли бы вы помочь мне, пожалуйста, и указать на ошибку, которую я сделал в моей конфигурации. Я просмотрел все подобные вопросы в SO и не нашел решения. Также я изучил документацию Nginx и тоже не нашел ответа.

у меня есть линия proxy_redirect ~^/(.*) $scheme://$http_host/path1/$1; и я полагаю, что он должен выполнять работу, которую я хочу.

Кстати, я не могу занять / разместить (создать конфигурацию для корневого пути) в моей конфигурации Nginx, так как она зарезервирована для другого внутреннего сервера. Заранее спасибо.

Richard Smith avatar
флаг jp
Первый параметр оператора proxy_redirect должен соответствовать текстовой строке, возвращенной в заголовке Location ответа 302.Вы должны использовать `curl -I`, чтобы определить точный текст заголовка.
Michael Hampton avatar
флаг cz
Вы должны настроить серверное приложение для создания таких URL-адресов. Он не знает, что вы обслуживаете его маршруты по адресу /path1 (или /path2 или где-то еще), если вы явно не сказали ему об этом.
Herman Sid avatar
флаг gq
@MichaelHampton К сожалению, эти серверные части нельзя настроить для использования прокси. Они являются сторонними приложениями и не имеют для этого никаких настроек.
Herman Sid avatar
флаг gq
@RichardSmith Да, я думаю так же. Мое регулярное выражение proxy_redirect не соответствует возвращенному местоположению перенаправления. Я проверил и обнаружил, что бэкенд отвечает «/login» в заголовке Location. Nginx объединяет его с доменным именем, и я получаю «https://example.com/login». Таким образом, Nginx не сопоставляет его с '~^/(.*)' и не добавляет префикс.
Рейтинг:0
флаг jp

Возможно, это из-за неправильного написания X-Forwarded-Headers в вашей конфигурации. Должен быть X-Перенаправлено-* вместо X-Вперед-*.

Ответить или комментировать

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