nginx proxy_pass使用子文件夹


11

好的,此任务应该很简单,但我无法使其正常工作。我想在我的域名之后(实际上是在该域名的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

可以注意到,它可能是如此复杂。我在这里想念什么?

谢谢帕特


您是指“重定向到端口”还是“代理到端口”?他们是完全不同的。您的问题尚不清楚,也许您可​​以扩展包括客户在内的用例。
蒂姆(Tim)

Answers:


12

由于您将其标记为反向代理问题,因此我假设您是要代理请求,以便用户仅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$1变量之后的URI部分,并在proxy_pass指令中使用它。


谢谢。那有点窍门。aaa.bbb.ccc.ddd:8001仅部分显示。该页面上有websockets和大量的Java脚本。我猜想那是因为我代理了端口并且不像上述的Tim那样转发它。仅使用nginx真的可以实现吗?
pAt84 '16

资源的URL在aaa.bbb.ccc.ddd:8001页面上是什么样的?您最有可能需要修复URL以包含该/app2部分。
Tero Kilkanen

那里实际上只是一个网络套接字(显示一些雷达数据,汽车等)。在源代码中没有“ app2”的迹象。
pAt84 '16

好的,是的。要调用websocket JS,请使用“ var ws = new WebSocket('ws://'+ location.host +'/ ws');”。location.host现在错过了端口号,这使整个事情不再起作用。
pAt84 '16

好的,这样看来,一旦我调用aaa.bbb.ccc.ddd / app2,我就要求它在内部使用aaa.bbb.ccc.ddd:8001。另一个选择是更改所有Java脚本。原因是我想使用nginx给我一个“单端口解决方案”,但是在我访问之后(例如通过http // aaa.bbb.ccc.ddd / app2),我会在内部需要它回到aaa.bbb.ccc.ddd:8001。那可能吗?
pAt84 '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.