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

NAR*_*KOZ 15 nginx virtualhost

我想设置一个默认的全能服务器块来处理任何与我的确切server_name值不匹配的主机名。但我不确定我应该使用哪一个。

server {
    listen 80 default_server;
    server_name ""; # this is by default if no server_name specified
    return 444;
}
Run Code Online (Sandbox Code Playgroud)

或者

server {
    listen 80 default_server;
    server_name _;
    return 444;
}
Run Code Online (Sandbox Code Playgroud)

我已经测试过,它们似乎表现得一样。它们之间有什么区别吗?

小智 18

简短回答:是的,server_name "";和之间有区别server_name _;

长答案: server_name ""; 定义了 自 0.8.48 以来没有host 标头的请求的匹配项,并且自 0.7.12 以来已得到支持。

https://nginx.org/en/docs/http/request_processing.html

如果不允许没有“Host”头字段的请求,可以定义一个只丢弃请求的服务器:

server {
    listen      80;
    server_name "";
    return      444;
}
Run Code Online (Sandbox Code Playgroud)

在这里,服务器名称设置为一个空字符串,它将匹配没有“Host”头字段的请求,并返回一个特殊的 nginx 非标准代码 444 来关闭连接。

另一方面,server_name _;定义一个从不与任何真实名称相交的无效服务器名称。这只是一个不匹配。因此,如果没有匹配项,nginx 将选择第一个 server{} 块并使用它。

总而言之,您可以使用server_name _;for catch-all server 块,但不能使用server_name "";.

参考 - /sf/ask/661833511/ https://blog.gahooa.com/2013/08/21/nginx-how-to-specify -a-默认服务器/

  • 我想知道,当我们有 `listen` 和 `default_server` 时,为什么我们需要 `server_name _;` 指令?这是为了提供信息吗? (5认同)
  • 我建议阅读此 --> https://nginx.org/en/docs/http/request_processing.html (2认同)