Nginx 中 server_name _ 和 server_name "" 有什么区别?

Nginx 中 server_name _ 和 server_name "" 有什么区别?

我想设置一个默认的 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/

相关内容