Nginx:如何将http请求转发到另一个端口?


64

我想做的是

当有人访问http://localhost/route/abc服务器时,响应与http://localhost:9000/abc

现在,我像这样配置Nginx:

location /route {
    proxy_pass  http://127.0.0.1:9000;
}

http请求已9000正确分派端口,但收到的路径http://localhost:9000/route/abc不是http://localhost:9000/abc

有什么建议吗?

Answers:


65

我讨厌这里的微妙之处,但尝试在9000的末尾添加/,如下所示。现在,它将不再将“路由”附加到转发的请求中。

location /route {
    proxy_pass  http://127.0.0.1:9000/;
}

4
这应该是公认的答案。/删除该位置中列出的前缀的方法很容易证明,简单地添加即可。
伯纳德

40

我相信您可以使用重写来删除URL的多余部分。就您而言,我认为您可以使用:

location /route/ {
    rewrite ^/route/?(.*)$ /$1 break;    
    proxy_pass  http://127.0.0.1:9000;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

但是,如果您的应用程序具有内部链接,它们可能仍指向/ abc / foo,而如果您执行此操作,则它们需要指向/ route / abc / foo,以便正确发送原始请求。如果可能,最好保留nginx配置,而配置应用程序以使其知道位于子目录中。

我知道这是一个老问题,但是当我尝试解决同一问题时,这对我来说是Google的热门话题!


谢谢 !在此链接中,我们可以查看变量列表:wiki.nginx.org/HttpProxyModule#Variables
Edgard Leal

17

尝试以下

location /route/ {
        proxy_pass  http://127.0.0.1:9000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

该解决方案最适合我,因为它保留了主机名。
Shafique Jamal '18

干净简单。
Ravshan Samandarov

7

vim nginx.conf

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

  server {
    listen 8080;

    location / {
      proxy_pass http://compute-1-36:8787;
      proxy_redirect http://compute-1-36:8787/ $scheme://$host:8080/;
    }
  }

该代码在8080上侦听,并重定向到compute-1-36上的端口8787。您可以在位置/中选择其他路径

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.