Frage Nginx: erzwingt SSL auf einem Pfad, nicht-SSL auf anderen


Wie richte ich die Nginx-Conf-Datei so ein, dass SSL nur für einen der Pfade auf meiner Site und nicht für SSL gilt?

Zum Beispiel möchte ich, dass alle URLs unter / user https sind, aber alle anderen URLs http sind.

Für den ersten Teil habe ich:

rewrite ^/user(.*) https://$http_host$request_uri?;

Ich möchte nicht "wenn" verwenden. Ich nehme an, dass es die Reihenfolge der Operation nutzen würde, aber ich möchte nicht in einer Schleife enden.


23
2018-05-16 21:14


Ursprung




Antworten:


In Ihrer nginx-Konfiguration sollten Sie zwei "Server" -Bereiche haben. Eine für Port 80 und eine für Port 443 (Nicht-SSL und SSL). Fügen Sie einfach einen Speicherort auf Ihrer Nicht-SSL-Website hinzu, um auf Ihre SSL-Seite umzuleiten.

server {
    root /var/www/
    location / {
    }
    location /user {
        rewrite ^ https://$host$request_uri? permanent;
    }
}

Es leitet den gesamten Verkehr, der unter / user endet, an Ihren https: // Server weiter.

Dann machen Sie in Ihrem 443-Server das Gegenteil.

server {
    listen 443;
    root /var/www/
    location / {
        rewrite ^ http://$host$request_uri? permanent;
    }
    location /user {
    }
}

34
2018-05-16 21:26



Oh Mann, das ist so einfach! Perfekt danke. - pbreitenbach
Dieser Ansatz ist gut, aber es fällt in ein paar gemeinsame Fallstricke, speziell "Root in location block" und "Taxing rewrites" - kolbyjack
Ich habe bearbeitet. Sieht es gut aus? Ich nahm auch listen 80 und fügte http_host hinzu. - pbreitenbach
Oh ja, danke! - Jürgen Paul
Bei dieser Konfiguration wechselt die Verbindung von / zu ssl / non-ssl, wenn ein Benutzer auf den Seiten der Site navigiert, ssl zu URLs, mit denen er gestartet wurde /user und nicht-ssl für alle anderen URLs. Infolgedessen gibt sogar Benutzer explizit ein https://www.example.com/ In der Adressleiste des Browsers befindet sich die resultierende Seite http://www.example.com/. Gibt es eine Möglichkeit, das automatische URL-Rewrite zwischen ssl / non-ssl zu implementieren, wie es durch die in dieser Antwort beschriebenen Einstellungen erreicht wird, aber trotzdem die explizite SSL-Anfrage respektiert, wenn sie explizit vom Benutzer in der Adressleiste eingegeben wird? Vielen Dank! - goodbyeera


Nginx ermöglicht es, sowohl HTTP als auch HTTPS innerhalb desselben zu verarbeiten server Block. Sie müssen also keine Direktiven für beide duplizieren und können den Pfad, den Sie sichern möchten, umleiten

server {
  listen 80 default_server;
  listen 443 ssl;
  ... ssl certificate and other configs ...

  location /user {
    if ($scheme = 'http') {
      rewrite ^ https://$http_host$request_uri? permanent;
    }
  }

  ... your basic configuration ...
}

Sicher sein nicht stellen ssl on Linie da, weil es einfaches HTTP bricht.

Optional können Sie alle anderen Anfragen von HTTPS auf die gleiche Weise zurück an HTTP umleiten:

if ($scheme = 'https') {
  rewrite ^ http://$http_host$request_uri? permanent;
}

AKTUALISIEREN: wie Alexey Ten freundlicherweise im Abschnitt Kommentare hervorhebt, überprüfend scheme auf jede Anfrage ist keine sehr gute Idee. Sie sollten die deklarative Art der Konfiguration Ihres nginx befolgen. Deklarieren Sie in diesem Fall zwei Serverblöcke mit Weiterleitungen durch locationVerschieben Sie die allgemeine Logik in eine separate Datei und include es in beiden. Die Antwort von GruffTech ist also besser.


10
2018-06-16 07:46



Es ist unwirksam, für jede Anfrage ein nginx-Prüfschema zu erstellen. - Alexey Ten
Ich weiß, dass die Frage vor 3 Jahren beantwortet wurde, aber ich fand es, während ich kämpfte, um das zu tun, was ich nach und nach tat, und wollte nur meine Ergebnisse mit Leuten teilen, die meinen Schritten folgen. - Hnatt
Nun, du solltest lesen wiki.ninx.org/IfIsEvil - Alexey Ten
@AlexeyTen ist es nicht der Fall "wenn Sie nicht vermeiden können, mit einem if"? Gibt es eine andere Möglichkeit, dieselbe Konfiguration für HTTP und HTTPS zu verwenden, ohne Direktiven zu duplizieren? - Hnatt
Benutzen include Richtlinie für gemeinsame Richtlinien. Einige Vervielfältigungen sind in Ordnung. - Alexey Ten