如果我已经拥有一堆虚拟主机,那么如何创建虚拟主机来处理与任何虚拟主机都不匹配的请求?(即通过 IP 访问、另一个域链接到 IP 等)
答案1
server_name _; 和 listen 配置上的 default_server 就是您要寻找的。
例子:
server {
listen 80 default_server;
server_name _;
root /var/www/default; (or wherever)
}
答案2
如果您使用 SSL,则需要为 default_server 提供一些额外的管道 - 证书和密钥(可以自签名)。
server {
server_name _;
listen 80 default_server;
listen 443 ssl default_server;
ssl_certificate <path to cert>;
ssl_certificate_key <path to key>;
return 404; # or whatever
}
Nginx 将尝试在 IP/端口匹配的 default_server 上接受 SSL 连接。如果此类服务器缺少证书/密钥,nginx 将断开连接。它不会尝试其他服务器。所以不要忘记证书/密钥。
答案3
server {
listen 80 default_server;
listen 443 ssl default_server;
listen [::]:80 default_server;
listen [::]:443 ssl default_server;
server_name _;
root /path/to/default;
}
这些条目分别用于端口 80(HTTP)、端口 443(HTTPS)、端口 80 IPv6 和端口 443 IPv6。
您可以考虑添加log_not_found off;
以避免添加未找到页面的日志条目。
答案4
如果您有listen
列出明确 IP 的指令,您还需要在默认块的 listen 指令中包含这些相同的 IP。
server {
listen 80 default_server;
listen 10.0.0.10:80 default_server;
server_name _;
}
server {
listen 10.0.0.10:80;
server_name foo.example.com;
}
listen 10.0.0.10:80 default_server
如果默认块中没有该指令,即使是您的默认 IP 地址foo.example.com
也会被提供服务。http://10.0.0.10
10.0.0.10