После некоторых проб и ошибок я понял это.
Проблема с примером 2 состоит в том, что вместо установки заголовка "Host", Apache решает неявно установить "X-Forwarded-Host" "заголовок. Честно говоря, я предпочел бы вместо этого ошибки вместо тихой установки другого заголовка, но все в порядке.
Однако, чтобы переслать хост (взять любой запрашиваемый поддомен и передать его на сервер узла), мы можем используйте удобную денди Apache ProxyPreserveHost On
, задокументировано здесь .
Это установит "X-Forwarded-Host" на запрошенный хост.
Следующее зависит от имплементации. Я использовал Node с Express.
Вот как я реализовал проверку:
function getSubDomains(host, offset = 2) {
const split = host.split(".").reverse();
return split.slice(2);
}
router.all('*', function (req, res, next) {
const subdomains = getSubDomains(req.get("X-Forwarded-Host"));
// code to use subdomains
Вы спрашиваете, почему я просто не переписал req.subdomains
? По какой-то причине это не сработало, поэтому я просто пошел с этим.
Наконец, я добавил быструю проверку, чтобы убедиться, что домен мой. Это, вероятно, не является необходимым, хотя.
function getSubDomains(host, offset = 2) {
const split = host.split(".").reverse();
if (split[0] !== "com" || split[1] !== "example") { // for *.example.com
return false;
}
return split.slice(2);
}
router.all('*', function (req, res, next) {
const subdomains = getSubDomains(req.get("X-Forwarded-Host"));
if (!subdomains) {
res.send("Huh?");
return;
}