nginx server_name wildcard or catch-all

NginxCatch AllServer Name

Nginx Problem Overview


I have an instance of nginx running which serves several websites. The first is a status message on the server's IP address. The second is an admin console on admin.domain.com. These work great. Now I'd like all other domain requests to go to a single index.php - I have loads of domains and subdomains and it's impractical to list them all in an nginx config.

So far I've tried setting server_name to * but that failed as an invalid wildcard. *.* works until I add the other server blocks, then I guess it conflicts with them.

Is there a way to run a catch-all server block in nginx after other sites have been defined?

N.B. I'm not a spammer, these are genuine sites with useful content, they're just powered by the same CMS from a database!

Nginx Solutions


Solution 1 - Nginx

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

Solution 2 - Nginx

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.

Solution 3 - Nginx

This will work:

server_name ~^(.+)$

Solution 4 - Nginx

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.

Solution 5 - Nginx

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

server_name ~^.*$

using regular expression of all.

Solution 6 - Nginx

Now you can use mask:

server {
    listen       80;
    server_name  *.example.org;
    ...
}

server {
    listen       80;
    server_name  mail.*;
    ...
}

Look more here: http://nginx.org/en/docs/http/server_names.html

Solution 7 - Nginx

If you also want to catch requests with empty Host header (which is allowed in HTTP/1.0) you can use both regex and empty server_name:

server {
    listen      80;
    server_name ~. "";
}

Solution 8 - Nginx

Try $http_host

server {
    server_name $http_host;
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionTakView Question on Stackoverflow
Solution 1 - NginxMattiasView Answer on Stackoverflow
Solution 2 - Nginxjp.gouigouxView Answer on Stackoverflow
Solution 3 - NginxTim KozakView Answer on Stackoverflow
Solution 4 - NginxSteely WingView Answer on Stackoverflow
Solution 5 - NginxAshishView Answer on Stackoverflow
Solution 6 - NginxredflasherView Answer on Stackoverflow
Solution 7 - NginxSchtolcView Answer on Stackoverflow
Solution 8 - NginxßãlãjîView Answer on Stackoverflow