nginx server_name wildcard or catch-all
NginxCatch AllServer NameNginx 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
server
directive
Only 1 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.
server
directive
Multiple 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;
}
server_name _;
About 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;
}