您只需要单个默认服务器块即可捕获其他服务器块中未定义的所有其他内容。您不需要公开该块中的任何真实证书;出于安全目的,请使用虚拟自签名证书/密钥。你不需要使用任何server_name
完全在那个街区;而且,那_
根本不充当通配符。你可以看到
server_name _;
由于历史原因,有时在一些 nginx 配置中,因为在 nginx 0.7.12 之前,您需要指定一些内容:server_name
,现在不再需要了。更多信息provided通过官方文档:
在包罗万象的服务器示例中,奇怪的名称"_"
看得到:
server {
listen 80 default_server;
server_name _;
return 444;
}
这个名字没有什么特别的,它只是无数与任何真实姓名不相交的无效域名之一。其他无效名称,例如"--"
and "!@#"
可以同等地使用。
下面是一个包罗万象的块的示例:
server {
listen 80 default_server;
listen [::]:80 default_server;
listen 443 default_server ssl;
listen [::]:443 default_server ssl;
ssl_certificate /some/path/any.crt;
ssl_certificate_key /some/path/any.key;
return 444; # silently drop the connection
# or you can define some landing page here
}
要在一行中生成一对自签名密钥/证书,您可以使用以下命令:
openssl req -nodes -new -x509 -subj "/CN=localhost" -keyout /some/path/any.key -out /some/path/any.crt
一个好的做法是将此存根服务器块作为/etc/nginx/conf.d/default.conf
or /etc/nginx/sites-enabled/default
文件内容,具体取决于您实际使用的虚拟主机服务风格(可以找到有关此主题的长篇讨论here在服务器故障处)。
如果您使用 certbot,请不要允许它在使用此类存根服务器块的情况下自动生成重定向服务器块。由于所有具有无效请求主机名的内容都将由存根块处理,而不是像
server {
if ($host = example.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
if ($host = www.example.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
listen [::]:80;
server_name example.com www.example.com;
return 404; # managed by Certbot
}
使用以下之一:
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
要将非 www 重定向到 www,将 HTTP 重定向到 HTTPS,请为每个托管虚拟主机使用三个服务器块:
server {
listen 80;
listen [::]:80;
listen 443 ssl;
listen [::]:443 ssl;
server_name example.com;
# ssl certificate/key for 'example.com' domain here
return 301 https://www.example.com$request_uri;
}
server {
listen 80;
listen [::]:80;
server_name www.example.com;
return 301 https://www.example.com$request_uri;
}
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name www.example.com;
# ssl certificate/key for 'www.example.com' domain here
# the main configuration part
...
}