Назад | Перейти на главную страницу

nginx proxy_pass перенаправляет игнорировать порт

Поэтому я настраиваю виртуальный путь, указывая на приложение node.js в моем nginx conf. соответствующий раздел выглядит так:

location /app {
  rewrite /app/(.*) /$1 break;
  proxy_pass http://localhost:3000;
  proxy_redirect off;
  proxy_set_header Host $host;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

Отлично работает, за исключением случаев, когда мое приложение node.js (экспресс-приложение) вызывает перенаправление.

В качестве примера, в блоке разработчика запущен nginx на порту 8080, поэтому URL-адрес корня приложения узла выглядит так:

http: // локальный: 8080 / приложение

Когда я вызываю перенаправление на / app из узла, фактическое перенаправление идет на:

http: // localhost / приложение

Мне просто нужно было решить ту же проблему с Jenkins, работающим за nginx. Для меня это сделало включение порта сервера в Host заголовок, который отправляется Дженкинсу:

proxy_set_header Host $host:$server_port;

Надеюсь, это поможет.

Проблема в том, что приложение Node.js неправильно выполняет перенаправление. Вы можете использовать proxy_redirect чтобы исправить это в nginx:

proxy_redirect http://localhost/ http://localhost:8080/;

Согласно разговору о этот вопрос, правильное разрешение - настроить прокси-сервер Host директива заголовка.

Измените это:

proxy_set_header Host $host;

К этому:

proxy_set_header Host $http_host;

$http_host содержит значение, указанное в заголовке HTTP HOST, который включает порт. Перенаправления должны использовать настраиваемый порт без дальнейшей настройки OP.

Эти ответы (тот же билет) развиваются дальше:

Я пробовал указанные выше решения, но все они терпели неудачу, когда приложение узла выдавало полный URL-адрес в заголовке местоположения, например "http://nodeapp.com:8080/new/location"

Итак, я закончил использовать $ http_host для передачи хоста и порта. И используя совпадение ~ ^, чтобы полностью переписать URL-адреса.

  proxy_pass http://10.0.0.3:8080;

  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header Host $http_host;

  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

  proxy_redirect default;
  proxy_redirect ~^(https?://[^:]+):\d+(?<relpath>/.+)$ http://10.0.0.3:8000$relpath;

В нашем случае сервер Node работает на 8080, а наш прокси nginx работает на 8000. Это означает, что каждый полностью определенный URL в заголовке местоположения необходимо переписать. Надеюсь, это кому-то поможет !!