我想要nginx / 0.7.6(在debian上,即configuration文件在/etc/nginx/sites-enabled/ )在一个子域(由Host头部指定)上提供一个站点,而在其他所有站点上都不提供。 但它坚定地忽略我的server_name设置?
在sites-enabled/sub.domain :
server { listen 80; server_name sub.domain; location / { … } }
添加一个sites-enabled/00-default
server { listen 80; return 444; }
什么也没有(我猜这只是匹配没有主机的请求?)
server { listen 80; server_name *.domain; return 444; }
是否阻止Host: domain请求给出Host: sub.domain结果,但仍将Host: arbitrary视为Host: sub-domain 。
在我看来,明显的解决办法是不被接受的:
server { listen 80; server_name *; return 444; }
既不是
server { listen 80 default_server; return 444; }
由于顺序似乎很重要:将00-default重命名为zz-default ,如果sorting,则将其置于最后,不会更改任何内容。 但是debian的主要configuration只包含* ,所以我想他们可以包含在一些任意文件系统定义的顺序中?
当Host:不是预期的sub.domain时,它将不会返回任何内容,但在Host完全缺失时仍然返回内容。 我以为第一个街区应该处理这种情况!? 是因为这是第一块吗?
server { listen 80; return 444; } server { listen 80; server_name ~^.*$; return 444; }
在nginx中定义默认服务器的方法是在服务器的listen语句中设置default_server标志(在0.7中,它只是default )。 server_name _; 并不意味着什么特别的。 nginx也不sortingglobbed文件名,所以这些文件不能保证包含在任何特定的顺序。
server { listen 80 default; return 444; }
使用这个作为第一个块匹配所有请求不匹配的任何以下server_name: sub.domain块。 不知道为什么_不工作,使用正则expression式似乎hackish。
server { listen 80; server_name ~^.*$ ""; return 444; }
即~^.*$匹配所有Host:头, ""匹配Host:头正在发送。
默认的虚拟主机应该包含:
server_name _;
这是一个捕获所有将匹配任何其他server_name指令中未指定的主机名称。
当您注意到server_name丢失时,您也是正确的,该块只匹配没有Host:头的请求。
请注意,这可能不适用于nginx 0.7.x,这是古董和可怕的过时,许多事情已经改变。 如果你坚持使用debian,请自己帮忙,并使用dotdeb软件库来保持与nginx,MySQL和PHP等软件保持同步 ,对Debian来说,更新要快得多。