By Christopher Francisco

2018-12-14 21:29:22 8 Comments

I have an Nginx reverse proxy inside a docker container, which listens to port 3000 and is exposed to 3002: docker run -p "3002:3000" ....

The idea is that this reverse proxy will proxy /my-app to the instance running in my laptop on port 8080; and /my-app/api to the cloud instance, in https://my-domain.

Here's the configuration:

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

upstream cloud {
  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;

The issues are:

  1. when I hit https://localhost:3002/my-app I get a 301 response to /my-app/ (trailing slash). I don't know why is that. The local app instance is shown in the browser, so I guess I can let it slide for the moment?
  2. when I hit https://localhost:3002/my-app/api/students, I get a 301 response to https://cloud/my-app/api/students. This causes CORS issues, of course, and the endpoint doesn't return data.

Now, I have configured reverse proxies a couple of times, so I am completely shocked that I'm not seeing what's wrong, this is not my first time.

I have tried tweaking with the upstreams, the proxy_set_headers, compared with another reverse proxy that I have for a different app; I'm out of ideas.

What am I doing wrong?


@Christopher Francisco 2018-12-19 14:35:02

The problem was my Host header in the cloud upstream, I had

proxy_set_header Host $http_host;

But it needed to be

proxy_set_header Host;

@mhndev 2018-12-15 00:32:46

here is an example config for nginx as a reverse proxy which works for me, I simplified it and removed unnecessary parts. I hope it helps.

upstream OAUTH {
    server remote_oauth;

server {
    listen  80;

    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;


I thinks you missed this part : proxy_pass_request_headers on

Related Questions

Sponsored Content

3 Answered Questions

19 Answered Questions

1 Answered Questions

[SOLVED] nginx reverse proxy for angular app running on nginx

1 Answered Questions

[SOLVED] How to set up nginx reverse proxy with multiple node apps

2 Answered Questions

2 Answered Questions

How to point many paths to proxy server in nginx

1 Answered Questions

[SOLVED] Difference HTTP Redirect vs Reverse Proxy in NGINX

1 Answered Questions

[SOLVED] Ngnix Jsession changed redirection issue

  • 2015-06-30 11:09:34
  • Mukesh Kumar
  • 564 View
  • 2 Score
  • 1 Answer
  • Tags:   nginx

Sponsored Content