我有一个托管几个网站的单个服务器;
为了减少问题,让我们假设它们只是两个:
http://www.example-A.com
https://www.example-B.com
站点A
仅提供HTTP连接,而站点B
拥有自己的SSL证书并提供安全的连接。
我的配置文件看起来像这样(相关部分):
http
{
server
{
listen 80;
server_name www.example-A.com;
[...]
}
server
{
listen 80;
server_name www.example-B.com;
return 301 https://www.example-B.com$request_uri;
}
server
{
listen 443 ssl;
ssl_certificate /usr/local/nginx/ssl/www.exampe-A.com.crt;
ssl_certificate_key /usr/local/nginx/ssl/www.exampe-A.com.key;
ssl_prefer_server_ciphers on;
server_name www.example-B.com;
[...]
}
}
现在,如果我连接到http://www.example-A.com
,一切都很好。
连接到https://www.example-B.com
也可以按预期工作。
连接到http://www.example-B.com
导致重定向到https://www.example-B.com
到目前为止很好。
现在问题Arirses如果我尝试了与A
的安全连接:https://www.example-A.com
我希望服务器拒绝连接。
我得到的是浏览器警告连接不安全。
当我继续前进时,我降落在域https://www.example-A.com
上,但提供了www.example-B.com
的内容。
如果我添加到配置
server
{
listen 443 ssl;
server_name www.example-A.com;
return 444;
}
然后尝试与A
的安全连接如预期的失败。
,但也连接到https://www.example-B.com
失败。
我想念什么?为什么server_name
不尊重指令?
如何在HTTP中使用A
,https中的B
和块无支撑的HTTPS连接到A
?
我正在运行
$ nginx -V
nginx version: nginx/1.12.2
built with OpenSSL 1.1.0d 26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/usr/local --sbin-path=/usr/local/sbin/nginx --conf-path=/usr/local/nginx/nginx.conf --with-http_ssl_module --with-http_stub_status_module --with-pcre=../pcre-8.37 --add-module=../headers-more-nginx-module-0.33
最好的做法是拥有一个default_server
,该指令指定使用>>>>>>>>>服务器,如果hostname不知道,您可以将其用作catch-all处理所有与server_name
值不匹配的主机名。没有这个,第一台服务器将被视为默认服务
,例如
# 444 Close connection Without Response on requests without hostname
server {
listen 80 default_server;
listen 443 ssl default_server;
server_name _;
ssl_certificate /path/to/ssl/example.com.crt;
ssl_certificate_key /path/to/ssl/example.com.key;
return 444;
}