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

时间:2018-12-14 21:29:23

标签: docker nginx reverse-proxy

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

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

与其他针对不同应用的反向代理相比,我尝试过调整上游proxy_set_headers。我没主意了。

我在做什么错了?

3 个答案:

答案 0 :(得分:4)

虽然提问者的配置没有这个特殊问题,但尾部斜杠问题也可能导致重定向而不是代理,如the docs中所述:

<块引用>

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

答案 1 :(得分:0)

这是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;
    }


}

我认为您错过了这一部分: proxy_pass_request_headers上的

答案 2 :(得分:0)

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

proxy_set_header Host $http_host;

但这必须是

proxy_set_header Host my-domain.com;
相关问题