How to exclude specific subdomains server_name in nginx configuration

pgollangi picture pgollangi · Jan 27, 2016 · Viewed 8k times · Source

I'm using wildcard in server_name. I want to redirect all subdomains of example.com (configured as *.example.com) to foo.com except xyz.example.com

I have configuration as follows

server {
        listen          80;
        server_name     *.example.com;
        location / {
            proxy_pass      http://$1.foo.com;
        }
}

I don't want to change any request coming to xyz.example.com

Answer

Richard Smith picture Richard Smith · Jan 27, 2016

You need at least two server blocks, and nginx will select the more specific server block to handle the request. See this document for details.

You will need a server block for xyz.example.com such as:

server {
    listen      80;
    server_name xyz.example.com;

    location / {
        proxy_pass http://$1.foo.com;
    }
}

Then either a default_server or a wild card server, such as:

server {
    listen 80;
    server_name *.example.com;
    return http://foo.com/;
}

Or:

server {
    listen 80 default_server;
    return http://foo.com/;
}