riqitang
riqitang

Reputation: 3371

nginx reverse proxy "catch-all" location

EDIT: To be more clear, this is nginx version 1.13.8.

Take the following as an example nginx.conf file:

http {
    upstream portal_backend {
        server pc-loc43-01:15080;
    }
    upstream auth_backend {
        server pc-loc43-01:16080;
    }
    server {
        listen       9080 default_server;
        server_name  my-reverse-proxy;

        location / {
            auth_basic off;
            proxy_http_version  1.1;
            proxy_set_header Host $http_host;

            proxy_pass http://portal_backend/;
        }
        location /auth {
            auth_basic off;
            proxy_http_version  1.1;
            proxy_set_header    Host $http_host;

            proxy_pass http://auth_backend/auth;
        }
    }
}

I want to configure nginx to default to location / if it is unable to match the request to any of the locations, but I cannot find how to do this.

Upvotes: 1

Views: 13945

Answers (2)

riqitang
riqitang

Reputation: 3371

It must be related to how nginx does request matching -- somehow auth and authorize are too similar and it causes nginx problems (not a great explanation and maybe someone more experienced with nginx internals can chime in). The "solution" was to duplicate location / into location /authorize, so now the config file looks like:

...
    location / {
        auth_basic off;
        proxy_http_version  1.1;
        proxy_set_header Host $http_host;           
        proxy_pass http://portal_backend/;
    }
    location /authorize {
        auth_basic off;
        proxy_http_version  1.1;
        proxy_set_header Host $http_host;           
        proxy_pass http://portal_backend/;
    }
...

All the other routes work as I would have expected, e.g. /users, /customers, /whatever are all handled by location /

Upvotes: 1

NullDev
NullDev

Reputation: 7311

I don't see anything wrong with your code.

location / { is already the default location block for "unhandled" locations.


This would match all locations:

location / {
    # ...
}

This would match the root only:

location = / {
    # ...
}

This will match /auth and sub directories:

location /auth {
    # ...
}

Upvotes: 4

Related Questions