Nginx非HTTPS网站重定向到其他HTTPS网站

时间:2014-02-11 06:47:35

标签: ssl nginx

我正在使用nginx在ubuntu服务器上托管多个网站。基本上我的设置如下。

我的第一个域example1.com(已启用SSL)可以从http://example1.com以及https://example1.com访问。 此工作正常。

但是我的第二个域example2.com,我没有启用SSL - 但是当我输入https://example2.com时,网址会重定向到第一个域https://example1.com - 哪个错误< /强>

现在,我已经添加了此服务器块,如果有人在https://的网址中输入,它会重定向回http://上的same domain。但这不是处理这个问题的正确方法。有没有人有更好的想法?

server {
  listen   443 ssl;
  server_name  example2.com www.example2.com;
  rewrite ^   http://$server_name$request_uri? permanent;
}

2 个答案:

答案 0 :(得分:1)

这里的问题是您只使用单个IP地址(服务器端)并依赖TLS Server Name Indication扩展(客户端)。如果没有其他可用的处理请求,Nginx将始终使用您的默认HTTPS服务器。

您的解决方案对我来说非常合适,但如果您没有有效的证书,它会在客户端产生错误。唯一的另一种可能性是创建一个默认的无效HTTPS服务器,它只会丢弃连接尝试。但我猜这不是你想要的。

server {
    listen      443 ssl;
    server_name example2.com *.example2.com;
    return      301 http://$server_name$request_uri;
}

如果您在这一点重定向,请始终使用return

默认的无效catch all配置可能如下所示:

server {
    listen              443 ssl;
    server_name         _;
    ssl_certificate     blank.crt;
    ssl_certificate_key blank.key;
    return              403;
}

正如我所说,它只会丢弃在提交的标头中不包含有效HTTP主机的任何连接尝试,或者标头中提交的HTTP主机无效。

答案 1 :(得分:0)

具有以下内容将侦听443(SSL),并且由于您没有此域的SSL证书,nginx将使用第一个或默认SSL证书,这将导致无效域错误。只需删除它,以便它不会侦听443(SSL)。

server {
  listen   443 ssl;
  server_name  example2.com www.example2.com;
  rewrite ^   http://$server_name$request_uri? permanent;
}