我的节点服务器正在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
)。
经过一番反复尝试后,我发现了。
示例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;
}