nginx server_name wildcard or catch-all

Change listen option to this in your catch-all server block. (Add default_server) this will take all your non-defined connections (on the specified port).

listen       80  default_server;

if you want to push everything to index.php if the file or folder does not exist;

try_files                       $uri /$uri /index.php;

Per the docs, It can also be set explicitly which server should be default, with the **default_server** parameter in the listen directive


As a convention, the underscore is used as a server name for default servers.

From http://nginx.org/en/docs/http/server_names.html

In catch-all server examples the strange name “_” can be seen:

server {
   listen       80  default_server;
   server_name  _;
   return       444;
}

There is nothing special about this name, it is just one of a myriad of >invalid domain names which never intersect with any real name. Other >invalid names like “--” and “!@#” may equally be used.

Note that server_name _; alone is not enough. The above example only works because of default_server in the listen directive.


This will work:

server_name ~^(.+)$

For me somehow define default_server was not working. I solved it by

server_name ~^.*$

using regular expression of all.


Only 1 server directive

From Nginx listen Docs

The default_server parameter, if present, will cause the server to become the default server for the specified address:port pair. If none of the directives have the default_server parameter then the first server with the address:port pair will be the default server for this pair.

If you only have 1 server directive, that will handle all request, you don't need to set anything.


Multiple server directive

If you want to match all request with specified server directive, just add default_server parameter to listen, Nginx will use this server directive as default.

server {
    listen 80 default_server;
}

About server_name _;

From Nginx Docs

In catch-all server examples the strange name “_” can be seen:

server {
    listen       80  default_server;
    server_name  _;
    return       444;
}

There is nothing special about this name, it is just one of a myriad of invalid domain names which never intersect with any real name. Other invalid names like “--” and “!@#” may equally be used.

It doesn't matter what server_name you set, it is just an invalid domain name.