我正在使用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;
}
答案 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;
}