#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'
Что привело бы к подобной ерунде при развертывании за прокси.
Есть ли разумный способ получить имя хоста с портом из объекта запроса, если приложение запускается вне прокси?
Ответ №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 так же, как это будет работать при развертывании.