Как переадресовать хост субдомена на proxypass с Apache? - PullRequest
0 голосов
/ 22 февраля 2020

Мой сервер узлов прослушивает 127.0.0.1:7676. Тем не менее, он реагирует по-разному в зависимости от субдомена. При стандартной конфигурации ProxyPass (ниже) поддомен удаляется.

Как переслать поддомен на сервер узла?

Пример 1: Basi c Proxy Конфиг:

<VirtualHost *:80>
    ServerName example.com
    ServerAlias *.example.com

    ProxyPass / http://localhost:7676/

</VirtualHost>

Пример 2: Попытка передать просто "тестовый" поддомен для всех запросов

<VirtualHost *:80>
    ServerName example.com
    ServerAlias *.example.com

    RequestHeader set "Host" "test.example.com"
    ProxyPass / http://localhost:7676/

</VirtualHost>

Моя попытка (пример 2 ) не работает. Сервер узла по-прежнему не видит поддоменов. И даже если это сработало, мне нужно, чтобы оно было динамическим c (возьмите любой запрашиваемый поддомен и передайте его на сервер узла).

Обратите внимание, что может быть несколько поддоменов (test2.test1.example.com) .

1 Ответ

0 голосов
/ 22 февраля 2020

После некоторых проб и ошибок я понял это.

Проблема с примером 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;
    }
...