nodejs express: имя хоста с портом из req-объекта

#node.js #express #proxy #hostname

#node.js #экспресс #прокси #имя хоста

Вопрос:

Иногда я хочу отправить точный URL-адрес по почте из моего приложения узла. Или я хотел бы установить содержимое объекта фантомной страницы.

Я получаю полный URL-адрес, подобный этому, в моей настройке развертывания.

 'http://'   req.hostname   '/myapp'
  

Однако на компьютере разработчика это обычно приводит к:

http://localhost/myapp вместо выкл. http://localhost:3000/myapp

Я знаю, как получить порт, но я не хочу использовать что-то вроде:

 'http://'   req.hostname   ':'   port   '/myapp'
  

Что привело бы к подобной ерунде при развертывании за прокси.

http://domain.com:3000/myapp

Есть ли разумный способ получить имя хоста с портом из объекта запроса, если приложение запускается вне прокси?

Ответ №1:

Я не уверен, почему экспресс-запрос устарел host , но это безопасная часть кода для решения проблемы запуска экспресс-сервера за / не за прокси.

 const proxyHost = req.headers["x-forwarded-host"];
const host = proxyHost ? proxyHost : req.headers.host;
  

(Где я нашел это наиболее удобным, так это создание URL-адресов «возврата к» для рабочих процессов, включающих перенаправления, например: OAuth 2)

Ответ №2:

То, что вы ищете, — это заголовок X-Forwarded-For. Это самый безопасный способ получить исходный URL-адрес, если вы используете прокси, балансировщики нагрузки и т. Д. Проверьте, существует ли это в вашем запросе, и если существует, используйте его, в противном случае используйте то, что вы уже реализовали.

Этот экспресс-источник будет полезен:

  • Значение req.hostname является производным от значения, установленного в заголовке X-Forwarded-Host, который может быть установлен клиентом или прокси.

  • Обратный прокси-сервер может установить X-Forwarded-Proto, чтобы сообщить приложению, является ли оно https или http или даже недопустимым именем. Это значение отражается в req.protocol.

  • Значения req.ip и req.ips заполняются списком адресов из X-Forwarded-For.

Комментарии:

1. ДА. Я делаю это. Как уже упоминалось. При развертывании все работает так, как должно быть. Проблема существует только на моей платформе разработки. Итак, на данный момент у меня жестко запрограммирован localhost: 3000, а затем переключаю комментарии, прежде чем перейти к управлению версиями. Это работает, но это не элегантно, отсюда вопрос, есть ли что-то более разумное, чтобы заставить это работать при разработке localhost так же, как это будет работать при развертывании.