如何获取proxy_pass背后的当前URL?

时间:2016-03-29 16:25:53

标签: node.js express nginx

我在服务器http://255.255.255.255:8888/上运行了一项HTTP服务,该服务使用proxy_pass上的http://foo.tld/bar/baz/投放:

server {
    server_name foo.tld;

    location /bar/baz/ {
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $remote_addr;

        proxy_pass http://255.255.255.255:8888/;
    }
}

现在我正在发出获取http://foo.tld/bar/baz/的GET请求:

curl http://foo.tld/bar/baz/

8888端口上运行的HTTP服务是一个简单的Express应用程序。

app.get('/', (req) => {
    console.log('req.url', req.url);
    console.log('req.originalUrl', req.originalUrl);
});

我想获取所请求的URL的URL(或至少是绝对路径)。但是,使用上述代码req.urlreq.originalUrl/而不是/bar/baz/

如何获得服务的真正绝对路径?

3 个答案:

答案 0 :(得分:0)

尝试将proxy_pass http://255.255.255.255:8888/;更改为proxy_pass http://255.255.255.255:8888;

答案 1 :(得分:0)

在代理标头中,将以下内容设置为主机

X-Forwarded-Host

向应用添加受信任的代理:

app.set('trust proxy', 'your internal IP');

并使用此方法检索网址

req.originalUrl;

答案 2 :(得分:0)

首先,@ evan-lucas对原始问题的回答(https://stackoverflow.com/a/36290054/368691)是正确的。引用documentation

  

如果指定了proxy_pass而没有URI,则传递请求URI   服务器的格式与客户端在原始时发送的格式相同   处理请求,或传递完整的规范化请求URI   处理更改的URI时:

这种方法的问题在于它需要应用程序知道基本URL(/bar/baz)。一种方法是通过自定义标头传递它。问题回答了。

然而,为了记录,让我们回滚并理解原始问题(我很抱歉XY problem):

我的原始问题是我的应用尝试重定向到应用的基本路径,即

app.get('/test', (res) => {
    res.redirect('/');
});

通过此设置,我希望GET请求//foo.tld/bar/baz/test能够重定向到//foo.tld/bar/baz/。但由于HTTP服务托管在反向代理之后,因此上述结果是用户被重定向到//foo.tld/。我试图通过找出应用程序的绝对URL并将用户重定向到该URL(即/bar/baz/)来解决问题。

我不喜欢@ evan-lucas解决方案需要让应用知道基本URL。因此,我研究了如何重写Location标题。事实证明,nginx提供了一个指令:proxy_redirect

现在我能做到:

location /bar/baz/ {
    proxy_pass http://255.255.255.255:8888/;
    proxy_redirect ~/(.*)$ /bar/baz/$1;

    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $remote_addr;
}

现在Location标头Location: /quux被重写为/bar/baz/quux,而应用本身无需了解真实网址。