Прокси-сервер nginx перенаправляет игнорируемый порт

34

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

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 (экспресс-приложение) вызывает перенаправление.

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

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

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

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

Павел
источник
Вот некоторые ответы, которые предлагают использовать: proxy_set_header Host $ http_host; Но никто не сказал, что это может вызвать уязвимость (атака на заголовок узла). Пример атаки здесь и дополнительная информация здесь

Ответы:

14

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

proxy_redirect http://localhost/ http://localhost:8080/;
mgorven
источник
47

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

proxy_set_header Host $host:$server_port;

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

Воислав Стойкович
источник
3
Бинго. как говорит @mgorven, узел плохо настраивает перенаправление, потому что nginx плохо перенаправляет хост
Eric
5

Я пробовал описанные выше решения, но все они терпели неудачу, когда приложение узла выдавало полный 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-адрес в заголовке местоположения необходимо переписать. Надеюсь, это поможет кому-то !!

Марк Риггинс
источник
4

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

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

proxy_set_header Host $host;

К этому:

proxy_set_header Host $http_host;

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

Эти ответы (тот же билет) уточняют далее:

Фрэнк Коэль
источник