nginx HTTPS mit derselben Konfiguration wie HTTP


195

Gibt es eine Möglichkeit, Konfigurationsanweisungen für zwei Nginx- server {}Blöcke freizugeben ? Ich möchte vermeiden, dass die Regeln dupliziert werden, da die HTTPS- und HTTP-Inhalte meiner Website mit genau derselben Konfiguration bereitgestellt werden.

Derzeit ist es so:

server {
  listen 80;
  ...
}

server {
  listen 443;

  ssl on; # etc.
  ...
}

Kann ich etwas in der Art von:

server {
  listen 80, 443;
  ...

  if(port == 443) {
    ssl on; #etc
  }
}

Antworten:


262

Sie können dies wie folgt zu einem Serverblock zusammenfassen:

server {
    listen 80;
    listen 443 default_server ssl;

    # other directives
}

Offizielles How-To


6
Ah, ich hatte keine Ahnung, dass Nginx intelligent genug ist, um die SSL-Anweisungen zu ignorieren, wenn es über Port 80 geladen wird.
ceejayoz

72
Nginx ist alle Arten von WIN.
Jauder Ho

5
und wenn Sie mehrere Standorte an einem Server haben, ist es erwähnenswert, dass "Standard" nicht obligatorisch ist
luchaninov

4
So elegant, dass es weh tut ...
Alix Axel

3
funktioniert hier nicht ... "Die einfache HTTP-Anforderung wurde an den HTTPS-Port gesendet"
gcstr


27

Ich kenne keinen Weg, wie Sie ihn vorschlagen, aber es gibt sicherlich einen einfachen und wartbaren Weg.

Verschieben Sie allgemeine Servereinstellungen in eine separate Datei, z. B. "serverFoo.conf", und dann includein separate server {}Blöcke wie folgt :

server {
    listen 80;
    include serverFoo.conf;
}
server {
    listen 443 ssl;
    include serverFoo.conf;
}

2
+1 = funktioniert bei mir (Konnte mit der anderen Methode nicht zum

Das andere Beispiel berücksichtigt auch nicht 'proxy_pass', wenn es als Load Balancer fungiert.
Mike Purcell

Diese Option ist großartig, wenn Sie server_namefür jeden Port anders sind
iDev247

5
Benutze kein ssl mehr, benutze listen 443 ssl;ab sofort eins.
Gefahr89

Dies scheint die einzige Lösung zu sein, die mit dem aktuellen Nginx 1.10.1 funktioniert. Aus irgendeinem Grund werden zwei listenZeilen nicht richtig interpretiert, aber durch Verschieben in separate Zeilen wird dies server{}behoben.
Artur Bodera

9

Im Folgenden finden Sie ein ausführlicheres Beispiel für die bereits hilfreichen Antworten:

server {

    # Listen on port 80 and 443
    # on both IPv4 and IPv6
    listen 80;
    listen [::]:80 ipv6only=on;
    listen 443 ssl;
    listen [::]:443 ipv6only=on ssl;

    # Set website folder
    root /path/to/your/website;

    # Enable SSL
    ssl_certificate your-cert.pem;
    ssl_certificate_key your-cert.key;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv3:+EXP;
    ssl_prefer_server_ciphers on;
}

2
Ich weiß , dass dies eine ziemlich alte Antwort, aber da es sehr fertig ist wollte ich nur für andere , darauf hinzuweisen , die es benutzen können , dass Sie das SSLv3 - Protokoll als anfällig für die POODLE Verwundbarkeit deaktivieren sollten: disablessl3.com Stattdessen verwenden: ssl_protocols TLSv1 TLSv1 .1 TLSv1.2;
user147787

4

Nur um Igor / Jauders Beitrag hinzuzufügen, wenn Sie eine bestimmte IP hören, können Sie Folgendes verwenden:

listen xxx.xxx.xxx.xxx;
listen xxx.xxx.xxx.xxx:443 default ssl;
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.