如何使用Apache将子域主机转发到proxypass?

问题描述 投票:0回答:1

我的节点服务器正在127.0.0.1:7676侦听。但是,其响应取决于子域。使用标准的ProxyPass配置(如下),子域将被剥离。

如何将子域转发到节点服务器?

示例1:基本代理配置:

<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)无效。节点服务器仍然看不到任何子域。即使它确实起作用,我也需要它是动态的(获取请求的任何子域并将其传递给节点服务器)。

请注意,可以有多个子域(test2.test1.example.com)。

apache reverse-proxy mod-proxy
1个回答
0
投票

经过一番反复尝试后,我发现了。

示例2的问题在于,Apache决定隐式设置“ X-Forwarded-Host”标头,而不是设置“ Host”标头。老实说,我宁愿让它出错而不是默默地设置其他标头,但是可以。

但是,为了转发主机(获取请求的任何子域并将其传递给节点服务器),我们可以使用Apache方便的dandy ProxyPreserveHost On,已证明是here

这会将“ 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;
    }
© www.soinside.com 2019 - 2024. All rights reserved.