我有一台 Nginx 服务器,它同时托管网站的主域foo.com
和子域。我只有主域的证书,因此我只想对子域进行 HTTP 请求。我已经配置了两个服务器块,所有请求都运行正常:将被重定向到,并且只停留在 HTTP 上。bar.foo.com
http://foo.com
https://foo.com
http://bar.foo.com
然而,当我尝试连接时出现了一个问题https://bar.foo.com
,虽然我没有配置子域服务器块来监听 443 或 ssl 请求,但请求仍然被处理,并且在从浏览器收到警告后,指出证书的主机名与我请求的主机名不同,我得到的页面来自主域foo.com
。
因此,显然,原本server
应该只监听我主域的 HTTPS 请求的块,不知何故也在监听子域的 HTTPS 请求,我不希望发生这种情况。
这是我的主域配置:
server {
listen 80;
server_name foo.com www.foo.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl;
server_name foo.com www.foo.com;
ssl on;
ssl_certificate /etc/nginx/cert/foo.com.pem;
ssl_certificate_key /etc/nginx/cert/foo.com.key;
...
location / {
root /var/www/foo.com/public_html;
index index.html index.htm;
}
}
这是我的子域名配置:
server {
listen 80;
server_name bar.foo.com www.bar.foo.com;
location / {
root /var/www/bar.foo.com/public_html;
index index.html index.htm;
}
}
以下是 Nginx 配置文件的片段:
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /usr/share/nginx/html;
location / {
}
我尝试删除foo.com
主listen
域的 443 服务器块,但没有帮助。
我希望 Nginx 不监听诸如此类的请求,https://bar.foo.com
或者只是返回 404 或 444。
答案1
由于您只server
为端口 443 配置了一个块,因此它是 nginx 用于服务对端口 443 的所有请求的默认虚拟服务器。
要添加端口 443 (TLS) 的默认服务器,您可以添加以下虚拟主机:
server {
listen 443 default_server;
server_name _;
return 444;
}
答案2
我已经找到解决方案了。正如@Tero 和@Cosmic 正确指出的那样,我server
主域的唯一 443 块被设置为server
所有 443 请求的默认块。
我注释掉了server
Nginx配置文件中的该块/etc/nginx/nginx.conf
,并添加了以下两个server
块:
server {
listen 80 default_server;
server_name _;
return 444;
}
server {
listen 443 ssl default_server;
server_name _;
ssl_certificate /etc/nginx/cert/foo.bar.pem;
ssl_certificate_key /etc/nginx/cert/foo.bar.key;
return 444;
}
第一个将被设置server
为任何 HTTP 请求的默认阻止,删除任何不匹配的请求,同样第二个将删除任何不匹配的 443 或 HTTPS 请求。
@Tero 提供的解决方案不起作用,因为 Nginx 需要任何 SSLserver
块的证书,因此您需要为其提供证书。