我想做的是:当有人访问http://localhost/route/abc时,服务器的响应与http://localhost:9000/abc完全相同
现在我像这样配置Nginx服务器: ,但收到的路径是9000而不是http://localhost:9000/route/abc
有什么建议吗?

#1 楼

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

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


评论


这应该是公认的答案。简单地添加/作为删除该位置中列出的前缀的方法,有据可查。

–伯纳德
16年9月12日在12:39

#2 楼

我相信您可以使用重写来删除URL的多余部分。在您的情况下,我认为您可以使用:

location /route/ {
    rewrite ^/route/?(.*)$ / 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)
2014年12月12日,0:23

#3 楼

请尝试以下

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年9月29日在20:18

干净简单。

–拉夫山·萨曼达罗夫(Ravshan Samandarov)
19年3月15日在11:24

#4 楼

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。
您可以在位置/中选择其他路径。