46

If I already have a bunch of virtualhosts, how can I create a virtual host to handle requests that don't match any of the virtualhosts? (i.e. access by IP, another domain linking to IP, .etc .etc)

4 Answers 4

59

server_name _; and default_server on the listen configuration are what you are looking for.

Example:

server {

   listen 80 default_server;
   server_name _;

   root /var/www/default; (or wherever)    

}
6
  • 1
    And for the https case: listen 443 ssl default_server; Sep 15, 2015 at 16:34
  • When I enable this, my owncloud 9 won't respond. Why? Owncloud VHOST has a server_name and is no default_server. Jul 16, 2016 at 7:56
  • I don't use 80 only 443 is open. Jul 16, 2016 at 8:06
  • If I add this, my other config snippets in /etc/nginx/sites-enabled/ are ignored. all domains go to /var/www/default in this case. How do I have to order the snippets?
    – rubo77
    Aug 11, 2018 at 14:57
  • I can create a vhos to postgresql connections? Sep 14, 2018 at 14:35
6

If you use SSL, then you need some extra plumbing for a default_server - certificate and key (that can be self-signed).

server {
    server_name _;
    listen 80 default_server;
    listen 443 ssl default_server;
    ssl_certificate <path to cert>;
    ssl_certificate_key <path to key>;
    return 404; # or whatever
}

Nginx will try to accept SSL connection on an IP/port-matching default_server. If such server is missing cert/key, nginx will drop the connection. It won't try other servers. So don't forget cert/key.

1
  • 1
    Important note about the SSL certificate! If the certificate is missing, the whole nginx server will not run (even though nginx -t says "ok")
    – Philipp
    Mar 11, 2019 at 22:20
3
server {
  listen 80 default_server;
  listen 443 ssl default_server;
  listen [::]:80 default_server;
  listen [::]:443 ssl default_server;

  server_name _;
  root /path/to/default;
}

The entries are for port 80 (HTTP), port 443 (HTTPS), port 80 IPv6, and port 443 IPv6, respectively.

You could consider adding log_not_found off; to avoid adding a log entry for the page not being found.

1

In the event that you have listen directives with explicit IPs listed, you will need to also include these same IPs in your default block's listen directive.

server {
    listen 80 default_server;
    listen 10.0.0.10:80 default_server;
    server_name _;
}

server {
    listen 10.0.0.10:80;
    server_name foo.example.com;
}

Without the listen 10.0.0.10:80 default_server directive in the default block, foo.example.com would be served for http://10.0.0.10 even if 10.0.0.10 is your default IP address.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.