I have two domains that point to the same server, one we'll call home
and one we'll call web
.
I'm running nginx on port 80 for HTTP and 443 for HTTPS. In my server definitions, I've defined two servers:
server {
listen 80;
server_name web;
# ...
}
server {
listen 443;
server_name web;
# ...
}
In practice, it works just fine. However, when I try accessing home
, which points to the same IP address as web
, I get served web
rather than getting a 404 or the like.
How can I configure nginx to 404 requests that don't match a server name? Do I need to define a default server which just bounces things down to 404s?
For http:
For https, you actually need to point nginx at ssl cert/key. According to documentation, nginx only looks at 'Host' header and does not look at TLS SNI when matching server_name. This means that nginx must be able to accept/decrypt ssl connection before it can inspect the Host header.
The cert/key can be any cert/key e.g. self-signed.
If cert/key are not specified, nginx still tries to use such default_server and fails as it can't accept ssl connection.
The Catchall server block also needs a
server_name
that you need to set to an invalid value like_
. This way, the server block will not match any other hostname and will just be used as last resort. The config will look like this:The first server {} in your config is like a catch-all so that is why it is being shown. Add something like this before the listen 80 server {}