我有一个包含许多虚拟服务器的Web服务器。其中只有1个是SSL。问题是,因为没有侦听SSL的全部服务器块,所以对其他站点的任何https请求都由1个SSL块提供。
实际上,我的配置如下所示:
# the catch all
server {
listen 80 default;
# I could add this, but since I have no default cert, I cannot enable SSL,
# and this listen ends up doing nothing (apparently).
# listen 443;
server_name _;
# ...
}
# some server
server {
listen 80;
server_name server1.com;
# ...
}
# some other server ...
server {
listen 80;
server_name server2.com;
# ...
}
# ... and it's https equivalent
server {
listen 443;
ssl on;
server_name server2.com;
# ...
}
现在,由于没有默认的443侦听器,像这样的请求https://server1.com
最终将由server2.com
https块提供服务。这遵循的逻辑server_name
中的文档。
如果不匹配,将根据以下顺序使用配置文件中的服务器{...}块:
- 具有匹配的侦听指令的服务器块,标记为[default | default_server]
- 具有匹配侦听指令的第一个服务器块(或隐式侦听80;)
此问题的首选解决方案是什么?我是否需要为捕获所有服务器块设置虚拟证书,以便我可以侦听443并处理错误的请求?是否有我不知道的参数会强制与之精确匹配的主机名server
?