我在服务器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.url
和req.originalUrl
为/
而不是/bar/baz/
。
如何获得服务的真正绝对路径?
答案 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
,而应用本身无需了解真实网址。