我有一个Web服务器与许多虚拟服务器。 其中只有一个是SSL。 问题是,因为没有监听SSL的Catchall服务器块,所以对其他站点的任何https请求都由1个SSL块提供服务。
本质上,我的configuration如下所示:
# 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的逻辑。
如果不匹配,configuration文件中的服务器{…}块将根据以下顺序使用:
- 这是否certificate了networking带宽瓶颈?
- 提高Nginx请求/秒的技巧?
- nginx和memcached如何一起工作?
- 禁用nginx代理中的URL解码
- 来自/etc/resolv.conf的Nginxparsing器地址
- 匹配listen指令的服务器块标记为[default | default_server]
- 具有匹配侦听指令的第一个服务器块(或隐式侦听80;)
什么是这个问题的首选解决scheme? 我是否需要为我的所有服务器块设置虚拟证书,以便我可以在443上进行侦听并处理错误的请求? 有没有一个参数,我不知道这强制一个确切的主机名与server匹配?
理想情况下,我希望nginx根本不提供https,除非主机名匹配,或者在同一个主机上redirect到http。
两者都不可能。 来自https://foo.example.com/的客户端的连接不能被除“foo.example.com”之一的SSL证书所接受。 在SSL连接被接受之前,没有机会redirect。
如果您将每个站点configuration为SSL,则通过证书错误点击的用户将获得他们请求的站点。 如果您为仅提供错误页面的SSLconfiguration“全部捕获”站点,并为应该支持SSL的站点configuration基于名称的虚拟主机,则可以向客户端提供错误页面。
SSL和HTTP虚拟主机只是不能很好地一起玩。
唯一的办法是创build一个自签名的SSL证书,并使用它来控制传入的https请求。 您可以通过本文中概述的几个简单步骤创build自签名SSL证书。
假设您创build一个名为server.crt的自签名证书。 然后你会在你的nginxconfiguration中添加以下内容:
server { listen 443; ssl on; ssl_certificate /etc/nginx/ssl/server.crt; ssl_certificate_key /etc/nginx/ssl/server.key; server_name server1.com; keepalive_timeout 60; rewrite ^ http://$server_name$request_uri? permanent; }
您仍然会收到浏览器的SSL警告消息,但至less您可以控制接下来会发生什么。
redirect到http:
server { listen 443; server_name *.com; rewrite ^ http://$host$request_uri? permanent; }
返回404:
server { listen 443; server_name *.com; return 404; }