nginx server_name wildcard or catch-all

Tak picture Tak · Feb 26, 2012 · Viewed 159.3k times · Source

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!

Answer

Mattias picture Mattias · Feb 26, 2012

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