
foo.com
Ich habe einen Nginx-Server, der sowohl die Hauptdomäne als auch eine Subdomäne für eine Website hostet bar.foo.com
. Ich habe nur ein Zertifikat für meine Hauptdomäne, daher möchte ich nur HTTP-Anfragen für die Subdomäne. Ich habe beide Serverblöcke konfiguriert und alle Anfragen funktionieren gut: http://foo.com
werden umgeleitet zu https://foo.com
und http://bar.foo.com
bleiben einfach bei HTTP.
Beim Versuch, eine Verbindung herzustellen https://bar.foo.com
, tritt jedoch ein Problem auf. Obwohl ich den Subdomänen-Serverblock nicht so konfiguriert habe, dass er auf 443- oder SSL-Anfragen wartet, wird die Anfrage trotzdem bearbeitet und nachdem ich eine Warnung vom Browser erhalten habe, dass das Zertifikat einen anderen Hostnamen hat als den, den ich anfordere, ist die Seite, die ich erhalte, von der Hauptdomäne foo.com
.
Offensichtlich hört der server
Block, der nur auf HTTPS-Anfragen meiner Hauptdomäne hören sollte, irgendwie auch auf HTTPS-Anfragen der Subdomäne, und das möchte ich nicht.
Hier ist meine Konfiguration für die Hauptdomäne:
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;
}
}
Hier ist meine Konfiguration für die Subdomäne:
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;
}
}
Und hier ist ein Ausschnitt der Nginx-Konfigurationsdatei:
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /usr/share/nginx/html;
location / {
}
Ich habe versucht, den Serverblock 443 meiner Hauptdomäne zu löschen, aber es hilft nicht foo.com
.listen
Ich möchte, dass Nginx entweder nicht auf Anfragen wie diese hört https://bar.foo.com
oder einfach 404 oder 444 zurückgibt.
Antwort1
Da Sie nur einen server
Block für Port 443 konfiguriert haben, ist dies der von nginx verwendete virtuelle Standardserver, um alle Anfragen an Port 443 zu bearbeiten.
Um einen Standardserver für Port 443 (TLS) hinzuzufügen, können Sie den folgenden virtuellen Host hinzufügen:
server {
listen 443 default_server;
server_name _;
return 444;
}
Antwort2
Ich habe die Lösung gefunden. Genau wie @Tero und @Cosmic richtig bemerkt haben, server
wird mein einziger 443-Block für die Hauptdomäne auf den Standardblock server
für alle 443-Anfragen gesetzt.
Ich habe den server
Block in der Nginx-Konfigurationsdatei auskommentiert /etc/nginx/nginx.conf
und die folgenden zwei server
Blöcke hinzugefügt:
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;
}
Der erste wird auf die Standardsperre server
für alle HTTP-Anfragen eingestellt und löscht alle nicht übereinstimmenden Anfragen. Der zweite löscht auf ähnliche Weise alle nicht übereinstimmenden 443- oder HTTPS-Anfragen.
Die von @Tero bereitgestellte Lösung funktioniert nicht, da Nginx für alle SSL- server
Blöcke ein Zertifikat erwartet. Sie müssen es daher mit einem Zertifikat versehen.