首页 > 解决方案 > 为什么我的 Nginx 反向代理执行 301 重定向而不是代理?

问题描述

我在 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;
    }
    ...
}

问题是:

  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 问题,并且端点不会返回数据。

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

与我为其他应用程序使用的另一个反向代理相比,我尝试调整上游代理集标题;我没主意了。

我究竟做错了什么?

标签: dockernginxreverse-proxy

解决方案


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

如果位置由以斜杠字符结尾的前缀字符串定义,并且请求由 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;
}

推荐阅读