nginx proxy pass переадресовує ігнорний порт


34

Тому я налаштовую віртуальний шлях під час вказівки на додаток 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 (експрес-додаток) викликає переадресацію.

Наприклад, у вікні dev працює nginx на порту 8080, і тому URL-адреса до кореня програми вузла виглядає так:

http: // localhost: 8080 / додаток

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

http: // localhost / app


Ось кілька відповідей, які пропонують використовувати: proxy_set_header Хост $ http_host; Але ніхто не сказав, що це може викликати вразливість (атака заголовка хоста). Приклад атаки тут І більше інформації тут

Відповіді:


14

Проблема полягає в тому, що програма Node.js неправильно видає переспрямування. Ви можете скористатися, proxy_redirectщоб виправити це в nginx:

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

47

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

proxy_set_header Host $host:$server_port;

Сподіваюся, що це допомагає.


3
Бінго. як говорить @mgorven, вузол погано налаштовує переспрямування, оскільки nginx погано пересилає хост
Ерік

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, який включає порт. Перенаправлення повинні підбирати користувацький порт без подальшої настройки для налаштування ОП.

Ці відповіді (той самий квиток) детальніше:

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.