Obey server_name in Nginx
- by pascal
I want nginx/0.7.6 (on debian, i.e. with config files in /etc/nginx/sites-enabled/) to serve a site on exactly one subdomain (indicated by the Host header) and nothing on all others. But it staunchly ignores my server_name settings?!
In sites-enabled/sub.domain:
server {
listen 80;
server_name sub.domain;
location / { … }
}
Adding a sites-enabled/00-default with
server {
listen 80;
return 444;
}
Does nothing (I guess it just matches requests with no Host?)
server {
listen 80;
server_name *.domain;
return 444;
}
Does prevent Host: domain requests from giving results for Host: sub.domain, but still treats Host: arbitrary as Host: sub-domain.
The, to my eyes, obvious solution isn't accepted:
server {
listen 80;
server_name *;
return 444;
}
Neither is
server {
listen 80 default_server;
return 444;
}
Since order seems to be important: renaming 00-default to zz-default, which, if sorted, places it last, doesn't change anything. But debian's main config just includes *, so I guess they could be included in some arbitrary file-system defined order?
This returns no content when Host: is not sub.domain as expected, but still returns the content when Host is completely missing. I thought the first block should handle exactly that case!? Is it because it's the first block?
server {
listen 80;
return 444;
}
server {
listen 80;
server_name ~^.*$;
return 444;
}