Weiterleitung zu https, sofern es sich nicht um ein privates Netzwerk auf Nginx handelt

Weiterleitung zu https, sofern es sich nicht um ein privates Netzwerk auf Nginx handelt

Ich möchte alle Anfragen von außerhalb des Netzwerks auf https umleiten, interne Anfragen jedoch auf http belassen.

Im Moment habe ich zwei .confDateien – eine, die so beginnt:

server {
        # listen [::]:443 ssl ipv6only=on; # managed by Certbot                                                                                                                                              
        listen 443 ssl; # managed by Certbot                                                                                                                                                                 
        server_name www.example.com , example.com;         
        # omitted stuff
}

und enthält

server {
    listen 80;
    server_name www.example.com , example.com;         
    return 301 https://$host$request_uri;
}

und ein anderes, das so beginnt:

server {                                                                                                                                                                                                     
        listen 192.168.1.144:80;                                                                                                                                                                             
        listen 192.168.1.196:80;                                                                                                                                                                             
                                                                                                                                                                                                             
        server_name "";                                                                                                                                                                                      
        root /var/www/html;                                                                                                                                                                                  
        # omitted stuff
   }

Aber gerade jetzt Anfragen anhttp://example.comLassen Sie sich nicht zu https weiterleiten.

Warum ist das so? Was habe ich falsch gemacht? Mein Ziel ist, alle Anfragen, die nicht aus dem privaten Heimnetzwerk ( 192.168.1.*) kommen, auf https umzuleiten und interne Anfragen in Ruhe zu lassen.

Antwort1

server_nameDie Direktive verwendet Leerzeichen zur Trennung von Domänennamen. Ihre Konfiguration enthält Kommas, was nginx verwirrt.

Sie müssen Folgendes verwenden:

server_name www.example.com example.com;

Antwort2

Ich gehe davon aus, dass Sie mit dem Folgenden versuchen, einen anderen Serverblock zu erstellen, der auf zwei Schnittstellen im lokalen Netzwerk lauscht:

server {
    listen 192.168.1.144:80;
    listen 192.168.1.196:80;
    # ...
}

Damit dies funktioniert, müsste Ihre Topologie ungefähr wie folgt aussehen:

Topologie mit Nginx direkt mit dem Internet verbunden

Wenn sich Ihr Server jedoch hinter demselben NAT befindet wie die Clients im privaten Netzwerk , wird 192.168.1.0/24dieser Block auch für die externen Verbindungen verwendet. Diese Topologie würde ungefähr so ​​aussehen:server

Topologie mit NAT und Portweiterleitung

Bei letzterem könnte man z.B. denngx_http_geo_moduleum das lokale Netzwerk basierend auf seinen Clients zu trennen:

geo $external {
    default         1;
    192.168.1.0/24  0;
}

server {
    listen 80;
    server_name example.com www.example.com;
    root /var/www/html;
    
    if ($external) {
        return 301 https://$server_name$request_uri;
    }
}

Aus Sicherheitsgründen würde ich jedoch nicht empfehlen, Ihrem internen Netzwerk auf diese Weise zu vertrauen, sondern TLS für alle Clients gleichermaßen zu verwenden. Denn allein durch den Zugriff auf das lokale Netzwerk kann man leicht eine MitM-Position erlangen.

Antwort3

Versuchen Sie dies für die Weiterleitung. Für den internen Gebrauch ziehe ich es persönlich vor, den Servernamen anhand der IP-Adresse zu erstellen.

server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl;
    listen [::]:443 ssl;

    ssl_certificate /etc/ssl/example.crt;
    ssl_certificate_key /etc/ssl/example.key;

    server_name example.com www.example.com;

    location{
       .......
    }
}

verwandte Informationen