为什么我的 Nginx 反向代理执行 301 重定向而不是代理?

Chr*_*sco 8 reverse-proxy nginx docker

我在 docker 容器中有一个 Nginx 反向代理,它侦听端口 3000 并暴露于 3002: docker run -p "3002:3000" ...

这个想法是这个反向代理将代理/my-app到我的笔记本电脑上运行的 8080 端口的实例;和/my-app/api到云实例,在https://my-domain.

这是配置:

upstream my-laptop {
  server host.docker.internal:8080; # this is a magic hostname for the laptop's IP address.
  keepalive 64;
}

upstream cloud {
  server my-domain.com:443;
  keepalive 64;
}

server {
    listen       3000;

    include ssl/ssl-certs.conf;
    include ssl/ssl-params.conf;

    location /my-app {
        proxy_pass http://my-laptop;
        proxy_set_header Host            $http_host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    location /my-app/api {
        proxy_pass https://cloud;
        proxy_set_header Host            $http_host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

问题是:

  1. 当我点击时,https://localhost:3002/my-app我收到 301 响应/my-app/(尾部斜杠)。我不知道这是为什么。本地应用程序实例显示在浏览器中,所以我想我可以让它暂时滑动吗?
  2. 当我点击时https://localhost:3002/my-app/api/students,我收到 301 响应https://cloud/my-app/api/students。当然,这会导致 CORS 问题,并且端点不返回数据。

现在,我已经配置了几次反向代理,所以我完全震惊了我没有看到有什么问题,这不是我第一次。

与我为不同应用程序使用的另一个反向代理相比,我尝试调整上游,proxy_set_headers;我没有想法了。

我究竟做错了什么?

RTS*_*lio 12

尽管提问者的配置没有这个特定问题,但尾随斜杠问题也可能导致重定向而不是代理,如文档中所述:

如果位置由以斜杠字符结尾的前缀字符串定义,并且请求由 proxy_pass、fastcgi_pass、uwsgi_pass、scgi_pass、memcached_pa​​ss 或 grpc_pass 之一处理,则执行特殊处理。为了响应 URI 等于此字符串但没有尾部斜杠的请求,将返回带有代码 301 的永久重定向到所请求的 URI,并附加斜杠。如果不需要这样做,可以像这样定义 URI 和位置的精确匹配:

location /user/ {
   proxy_pass http://user.example.com;
}

location = /user {
    proxy_pass http://login.example.com;
}
Run Code Online (Sandbox Code Playgroud)


Chr*_*sco 7

问题是我的Host头在上游云中,我有

proxy_set_header Host $http_host;
Run Code Online (Sandbox Code Playgroud)

但它需要是

proxy_set_header Host my-domain.com;
Run Code Online (Sandbox Code Playgroud)