我对 nginx 子域有一个奇怪的问题。首先,我的配置:
server {
listen 443 ssl;
server_name secure.example.com;
ssl_certificate example.crt;
ssl_certificate_key example.key;
keepalive_timeout 70;
location / {
fastcgi_pass 127.0.0.1:8000;
...
}
}
server {
listen 80;
server_name example.com www.example.com;
location / {
fastcgi_pass 127.0.0.1:8000;
...
}
}
我的想法是我有一个安全域secure.example.com
和一个普通域,example.com
. 在实践中,我可以去https://example.com
和http://secure.example.com
。我使用中间服务器解决了第二个问题:
server {
listen 80;
server_name secure.example.com;
rewrite ^(.*) https://secure.example.com$1 permanent;
}
但这不是最佳解决方案,我必须创建另一个以将 tld 上的 https 重定向到子域。如果我需要多个这样的服务器,我觉得我一定做错了。为什么https://example.com
在没有服务器监听 443 的情况下工作?它不应该只是无法连接吗?我比较困惑。
在
server_name
80/tcp (HTTP) 或 443/tcp (HTTPS) 上的连接建立后评估(或更准确地说是 HTTP/1.1 Host 标头)。这意味着如果secure.example.com
和example.com
拥有相同的 A 资源记录(它们指向相同的 IP 地址),那么在建立连接和 HTTP/1.1 Host 标头之前,无法判断客户端要查看哪个虚拟主机发送。更准确地说,TCP/IP 与 IP 地址(IP 部分)和端口(TCP 部分)一起工作。因此,如果您将进程(例如 nginx)绑定到某个 IP 地址和端口,它将始终在此套接字上应答,而 TCP/IP 对 HTTP/1.1 及其 Host 标头一无所知。
如果您想简化您的 nginx 配置,您可以编写以下代码:
查看 Nginx server_name 文档。它表示如果您的虚拟主机列表中没有任何匹配项,nginx 将使用第一个server {}块和匹配的监听指令。
如果您想强制用户使用带有https的secure.example.com主机,您可以采用与相反情况相同的解决方法。