代码之家  ›  专栏  ›  技术社区  ›  Christopher Francisco

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

  •  0
  • Christopher Francisco  · 技术社区  · 6 年前

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

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

    我试过对上游的proxy-set-headers进行调整,与另一个相反的proxy相比,proxy-set-headers是另一个应用程序的反向proxy;我没有想法了。

    我做错什么了?

    2 回复  |  直到 6 年前
        1
  •  0
  •   Majid Abdolhosseini    6 年前

    下面是一个将nginx配置为反向代理的示例,我可以使用它, 我简化了它,去掉了不必要的部分。 希望能有所帮助。

    upstream OAUTH {
        server remote_oauth;
    }
    
    
    
    server {
        listen  80;
        server_name example.com;
    
        client_header_timeout       300;
    
    
        location = /servies/oauth {
          return 301 /services/oauth/;
        }
    
    
        location /services/oauth/ {
            proxy_pass_request_headers on;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_pass http://OAUTH/;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-ROOT-URI /services/oauth;
            proxy_set_header Accept-Encoding "gzip";
            proxy_buffering off;
            proxy_request_buffering off;
            proxy_http_version 1.1;
            proxy_intercept_errors on;
            proxy_redirect default;
            client_max_body_size 4M;
        }
    
    
    }
    

    我认为你错过了这一部分: 代理传递请求头

        2
  •  0
  •   Christopher Francisco    6 年前

    问题是我的 Host 在云端上游,我

    proxy_set_header Host $http_host;
    

    但它需要

    proxy_set_header Host my-domain.com;