我目前有两个 nginx 服务器块来处理对 下任何子域的请求example.com
。 在 下添加的子域example.com
必须是仅使用 HTTPS 的服务器。 因此服务器块如下:
server {
server_name ~^(.*)\.example\.com$;
root /var/www/x;
listen 443 ssl;
...
}
server {
listen 80;
server_name ~^(.*)\.example\.com$;
return 301 https://$host$request_uri;
}
客观的
现在,我还想添加一个默认服务器块任何其他服务器名称,但其所有流量只能在 HTTP 上提供服务,而不是 HTTPS。
因此第一次试验是:
server {
listen 80 default_server;
server_name _;
root /var/www/app;
...
}
这很好用,但如果处理的请求是这样的:https://abc.def.com
那么用户将收到“您的连接不是私密的”可怕错误,而事实上,如果他们被重定向到 HTTP,我会很高兴。
如果我添加:
server {
listen 443 default_server;
server_name _;
return 301 http://$host$request_uri;
}
然后它可以工作,但是第二个服务器块停止工作,我发现服务器无法处理请求。
我怎样才能做到这一点?
答案1
您要么监听端口443
,要么不监听。如果您监听端口,您将获得指向该 IP 的每个主机名的答案,因为主机名的信息仅在已建立的连接内传输。如果您https://
在非 HTTPS 站点上手动输入,并且同一 IP 同时监听80
HTTP 和443
HTTPS 端口,您将收到所有没有正确 TLS 证书的主机名的警告。
您有两个选择: