【问题标题】:How to forward subdomain host to proxypass with Apache?如何使用 Apache 将子域主机转发到 proxypass?
【发布时间】:2020-06-06 10:30:12
【问题描述】:

我的节点服务器正在监听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】:

    经过反复试验,我想通了。

    示例 2 的问题在于,Apache 没有设置“Host”标头,而是决定隐式设置“X-Forwarded-Host”标头。老实说,我宁愿它出错,也不愿默默地设置一个不同的标题,但是好吧。

    但是,为了转发主机(获取请求的任何子域并将其传递给节点服务器),我们可以使用 Apache 的方便的花花公子 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;
        }
    

    【讨论】:

    • ProxyPreserveHost On 应该设置Host 标头。
    • @DusanBajic 它不适合我。它设置了 X-Forwarded-Host
    猜你喜欢
    • 1970-01-01
    • 2018-05-13
    • 2016-01-11
    • 2016-09-02
    • 1970-01-01
    • 2013-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多