我想设置一个默认的 catch-all 服务器块来处理任何与我的确切值不匹配的主机名server_name
。但我不确定应该使用哪一个。
server {
listen 80 default_server;
server_name ""; # this is by default if no server_name specified
return 444;
}
或者
server {
listen 80 default_server;
server_name _;
return 444;
}
我已经测试过了,它们的表现似乎相同。它们之间有什么区别吗?
答案1
server_name "";
简短回答:是的,和之间有区别server_name _;
长答案: server_name "";
定义匹配请求,无需 host
标题自 0.8.48 以来,并且自 0.7.12 以来一直受到支持。
https://nginx.org/en/docs/http/request_processing.html
如果不允许没有“Host”标头字段的请求,则可以定义一个直接丢弃请求的服务器:
server { listen 80; server_name ""; return 444; }
这里将服务器名称设置为空字符串,将匹配没有“Host”头字段的请求,并返回特殊的nginx非标准代码444,从而关闭连接。
另一方面,server_name _;
定义一个无效的服务器名称,该名称永远不会与任何实际名称相交。它只是不匹配。因此,如果没有匹配,nginx 将选择第一个 server{} 块并使用它。
总而言之,您可以使用server_name _;
catch-all 服务器块,但不能使用server_name "";
。
参考 - https://stackoverflow.com/questions/9454764/nginx-server-name-wildcard-or-catch-all https://blog.gahooa.com/2013/08/21/nginx-how-to-specify-a-default-server/