反向代理两个位置,一个嵌套在另一个位置内

反向代理两个位置,一个嵌套在另一个位置内

我在一台机器上有两个服务器程序。一个在 localhost:3000 监听,另一个在 localhost:3001 监听。第二个是 API 服务器,第一个提供网页。

我想使用 nginx 作为反向代理,这样传入到 URI 的请求如下

https://example.com/api/what/ever 

重定向到第二台服务器http://localhost:3001/what/ever,如下所示

https://example.com/ and https://example.com/some/route/what/ever

重定向到第一台服务器

http://localhost:3000/ and http://localhost:3000/some/route/what/ever

换句话说,我想挑选一些example.com/api/*请求发送到第二台服务器,并将其余的请求发送到第一台服务器。

但是,它的工作方式就好像我的/api/位置指令不存在一样:所有内容都传递到第一个服务器,该服务器当然会对 api 请求响应 404,并且通常对其他请求也会响应 404。

这是我的 nginx.conf 尝试。

          location ^~ /hub/  {
            rewrite ^/hub(.*)$ $1 last;
            proxy_pass http://localhost:3001;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection 'upgrade';
            proxy_set_header Host $host;
            proxy_cache_bypass $http_upgrade;
            proxy_set_header        X-Real-IP       $remote_addr;
            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
          }

          location / {
            proxy_pass http://localhost:3000;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection 'upgrade';
            proxy_set_header Host $host;
            proxy_cache_bypass $http_upgrade;
            proxy_set_header        X-Real-IP       $remote_addr;
            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
          }

我还尝试了location ~ ^(?!/api).*$ {第二个位置指令,使用正则表达式试图使其与我的 /api/ URI 不匹配,但结果相同。

我做错了什么?这可能吗?

答案1

last语句中的关键字使rewriteNginx 重新开始搜索位置以处理重写的 URI。您的rewrite...last语句将请求发送到另一个位置块。

若要在同一个块内处理重写的 URI location,请使用break。请参阅这个文件了解详情。

例如:

location ^~ /hub/ {
    rewrite ^/hub(.*)$ $1 break;
    proxy_pass http://localhost:3001;
    ...
}

或者,也可以通过将可选 URI 附加到语句中的值来实现相同的转换proxy_pass。请参阅这个文件了解详情。

例如:

location ^~ /hub/ {
    proxy_pass http://localhost:3001/;
    ...
}

相关内容