麻烦配置nginx从单个服务器为HTTP和HTTPS站点提供服务

时间:2018-12-19 20:41:31

标签: http nginx https virtualhost

我有一台服务器托管很少的网站;
为了减少问题,我们假设它们只有两个:
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

到目前为止很好。

现在,如果我尝试与Ahttps://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

1 个答案:

答案 0 :(得分:0)

最佳做法是拥有一个default_server,如果主机名未知,此指令指定使用服务器,您可以将其用作处理所有主机名的通用方法与您的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;
}