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

Woo*_*aaa 104 nginx

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

现在我像这样配置我的 Nginx 服务器:

location /route {
    proxy_pass  http://127.0.0.1:9000;
}
Run Code Online (Sandbox Code Playgroud)

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

有什么建议?

小智 101

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

location /route {
    proxy_pass  http://127.0.0.1:9000/;
}
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的答案。简单地添加`/` 是删除位置中列出的前缀的方法。 (4认同)

小智 49

我相信您可以使用重写来删除 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;
}
Run Code Online (Sandbox Code Playgroud)

但是,如果您的应用程序中有内部链接,它们可能仍指向 /abc/foo ,如果您这样做,它们需要指向 /route/abc/foo 以便原始请求正确进入。如果可以的话,您最好保留 nginx 配置,而是将您的应用程序配置为知道它位于子目录中。

我知道这是一个老问题,但当我试图解决同样的问题时,它对我来说是谷歌的热门话题!


ALe*_*hha 24

尝试以下

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;
}
Run Code Online (Sandbox Code Playgroud)


小智 9

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/;
    }
  }
Run Code Online (Sandbox Code Playgroud)

此代码侦听 8080 并重定向到计算 1-36 上的端口 8787。您可以在 location / 中选择其他路径