0

I am trying to setup a reverse proxy using return function. The http was working fine for everything. I am using certbot for SSL Certificate configuration. When I am redirecting https://api.mydomain.com/foo to https://foo.mydomain.com it is returning an endless loop. I know this is an old topic but I tried every solution there in other threads. So I am sking again with my configuration. Here is the https configuration

server {
        server_name api.mydomain.com;
        absolute_redirect off;

        error_log /var/log/nginx/api.mydomain.com_error.log;
        access_log /var/log/nginx/api.mydomain.com_access.log;

        location / {
          proxy_pass http://localhost:3000;
          proxy_set_header Host $host;
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header X-Forwarded-Proto $scheme;
        }

        location ~ ^/foo(/.+)$ {
            return 301 http://foo.mydomain.com$1;
            add_header Access-Control-Allow-Origin *;
        }

        location ~ ^/bar(/.+)$ {
            return 301 http://bar.mydomain.com$1;
            add_header Access-Control-Allow-Origin *;
        }

    listen [::]:443 ssl; # managed by Certbot
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/api.mydomain.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/api.mydomain.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}

server {
        server_name foo.mydomain.com;

        error_log /var/log/nginx/foo.mydomain.com_error.log;
        access_log /var/log/nginx/foo.mydomain.com_access.log;

        location / {
          proxy_pass http://localhost:3001;
          proxy_set_header Host $host;
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header X-Forwarded-Proto $scheme;
        }

    listen [::]:443 ssl; # managed by Certbot
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/api.mydomain.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/api.mydomain.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}


server {
        server_name bar.mydomain.com;

        error_log /var/log/nginx/bar.mydomain.com_error.log;
        access_log /var/log/nginx/bar.mydomain.com_access.log;

        location / {
          proxy_pass http://localhost:3002;
          proxy_set_header Host $host;
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header X-Forwarded-Proto $scheme;
        }

    listen [::]:443 ssl; # managed by Certbot
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/api.mydomain.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/api.mydomain.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}

server {
    if ($host = api.mydomain.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


        listen 80;
        listen [::]:80;
        server_name api.mydomain.com;
    return 404; # managed by Certbot

}

server {
    if ($host = foo.mydomain.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


        listen 80;
        listen [::]:80;
        server_name foo.mydomain.com;
    return 404; # managed by Certbot


}

server {
    if ($host = bar.mydomain.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


        listen 80;
        listen [::]:80;
        server_name bar.mydomain.com;
    return 404; # managed by Certbot


}

I have also used the rewrite function instead of return like following but still no changes happened.

rewrite ^/foo/(.*)$ http://foo.mydomain.com/$1 permanent;

Here is the http configuration which is working fine

server {
        listen 80;
        listen [::]:80;
        server_name api.mydomain.com;
        absolute_redirect off;

        error_log /var/log/nginx/api.mydomain.com_error.log;
        access_log /var/log/nginx/api.mydomain.com_access.log;

        location / {
          proxy_pass http://localhost:3000;
          proxy_set_header Host $host;
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header X-Forwarded-Proto $scheme;
        }

        location ~ ^/foo(/.+)$ {
            return 301 http://foo.mydomain.com$1;
            add_header Access-Control-Allow-Origin *;
        }

        location ~ ^/bar(/.+)$ {
            return 301 http://bar.mydomain.com$1;
            add_header Access-Control-Allow-Origin *;
        }

}

server {
        listen 80;
        listen [::]:80;
        server_name foo.mydomain.com;

        error_log /var/log/nginx/foo.mydomain.com_error.log;
        access_log /var/log/nginx/foo.mydomain.com_access.log;

        location / {
          proxy_pass http://localhost:3001;
          proxy_set_header Host $host;
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header X-Forwarded-Proto $scheme;
        }
}

server {
        listen 80;
        listen [::]:80;
        server_name bar.mydomain.com;

        error_log /var/log/nginx/bar.mydomain.com_error.log;
        access_log /var/log/nginx/bar.mydomain.com_access.log;

        location / {
          proxy_pass http://localhost:3002;
          proxy_set_header Host $host;
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header X-Forwarded-Proto $scheme;
        }
}

I have tried the following solutions with no luck

  1. Nginx https reverse proxy infinite loop
  2. Nginx configuration leads to endless redirect loop
  3. Nginx leads to endless redirect loop after adding ssl certificates
  4. HTTP to HTTPS Nginx too many redirects
Devil's Dream
  • 633
  • 2
  • 15
  • 34

0 Answers0