好的,这个任务应该很简单,但我就是无法让它工作。我想在我的域名后面(实际上是在该域名的 IP 后面)有一个子文件夹,它会重定向到同一台服务器上的特定端口。本质上,我想摆脱必须使用许多端口的麻烦。
这是我的 nginx 配置
server {
listen 80;
index index.html index.htm index.nginx-debian.html index.php;
server_name aaa.bbb.ccc.ddd;
location ^~ /app2 {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $host;
proxy_pass http://aaa.bbb.ccc.ddd:8001;
}
}
因此,在访问 aaa.bbb.ccc.ddd/app2 时,我希望将其解析为http://aaa.bbb.ccc.ddd:8001。
这不可能太复杂。我在这里遗漏了什么?
谢谢你帕特
答案1
由于您将其标记为反向代理问题,我假设您的意思是您想要代理请求,以便用户只能http://aaa.bbb.ccc.ddd/app2
在其浏览器中看到 URL。
你可以将你的location
区块更改为:
location ~/app2(.*)$ {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $host;
proxy_pass http://aaa.bbb.ccc.ddd:8001$1;
}
/app2
这里我们捕获变量后的 URI 部分$1
,并在指令中使用它proxy_pass
。
答案2
Tero Kilkanen 的回答很棒。但是,在某些情况下,$1
无法找到非命名的正则表达式组(例如:)。我们可以使用命名组(例如$sub_dir
:)来防止此错误。
location ~/app2(?<sub_dir>.*)$ {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $host;
proxy_pass http://aaa.bbb.ccc.ddd:8001$sub_dir;
}
上面的例子用来(?<sub_dir>.*)
设置命名组,我们可以用它$sub_dir
来获取这个Regex组的值。