我希望设置一个默认的所有捕获服务器块,以处理与我的确切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;
}我已经测试过了,他们的行为似乎是平等的。他们之间有什么区别吗?
发布于 2018-12-26 06:17:13
简短的回答:是的,server_name "";和server_name _;之间有区别
长答案:自0.8.48以来,server_name "";就为没有host头的请求定义了匹配,并且从0.7.12开始就支持它。
https://nginx.org/en/docs/http/request_processing.html
如果不允许没有“主机”头字段的请求,则可以定义一个只删除请求的服务器:服务器{List80;server_name“;返回444;}在这里,服务器名称设置为一个空字符串,该字符串将与没有”主机“头字段的请求匹配,并返回一个特殊的nginx非标准代码444,从而关闭连接。
另一方面,server_name _;定义了一个无效的服务器名,它从不与任何实名相交。这只是一场非比赛。因此,如果没有匹配,nginx将选择第一个服务器{}块并使用它。
总之,您可以使用server_name _;来捕获所有服务器块,但不能使用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/
https://serverfault.com/questions/914906
复制相似问题