nginx proxy_pass 使用子文件夹

nginx proxy_pass 使用子文件夹

好的,这个任务应该很简单,但我就是无法让它工作。我想在我的域名后面(实际上是在该域名的 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组的值。

相关内容