Ich möchte eine Regel in Nginx erstellen, die zwei Dinge tut:
- Entfernt das "www." aus der Anfrage-URI
- Leitet zu "https" um, wenn der Anforderungs-URI "http" lautet
Es gibt viele Beispiele, wie man diese Dinge einzeln macht, aber ich kann keine Lösung finden, die beides richtig macht (dh keine Umleitungsschleife erstellt und alle Fälle richtig behandelt).
Es muss all diese Fälle behandeln:
1. http://www.example.com/path
2. https://www.example.com/path
3. http://example.com/path
4. https://example.com/path
Diese sollten alle ohne Schleife bei https://example.com/path (# 4) landen . Irgendwelche Ideen?
Antworten:
Der beste Weg, dies zu erreichen, besteht darin, drei Serverblöcke zu verwenden: einen, um http zu https umzuleiten, einen, um den https-www-Namen zu no-www umzuleiten, und einen, um tatsächlich Anfragen zu bearbeiten. Der Grund für die Verwendung zusätzlicher Serverblöcke anstelle von ifs ist, dass die Serverauswahl mithilfe einer Hash-Tabelle erfolgt und sehr schnell ist. If auf Serverebene bedeutet, dass if für jede Anforderung ausgeführt wird, was verschwenderisch ist. Außerdem ist das Erfassen der angeforderten URL beim Umschreiben verschwenderisch, da nginx diese Informationen bereits in den Variablen $ uri und $ request_uri (jeweils ohne und mit Abfragezeichenfolge) enthält.
quelle
https://example.com/
www.sub.example.com
nach umleitensub.example.com
undsub.example.com
bekomme dann erst ein SSL-Zertifikat für Jetzt weiß ich, dass die SSL-Zertifikatsüberprüfung vor der 301-Umleitung stattfindet, daher kann es nicht funktionieren. Weitere Erklärungen finden Sie hier: serverfault.com/a/358625/144811Das funktioniert bei mir:
Beachten Sie, dass beide
yourdomain.com
undwww.yourdomain.com
muss in dem SSL - Zertifikat sein. Dies ist mit einem Platzhalterzertifikat oder mit einem alternativen Servernamen möglich, wie hier erläutert . Überprüfen Sie https://www.startssl.com für nette und kostenlose Zertifikate, die dies tun. ( Edith : Ab Chrome-Version 56 werden startssl-Zertifikaten nicht mehr vertraut. Versuchen Sie stattdessen https://letsencrypt.org/ .)quelle
include
Regel verwenden, um es beiden SSL- Serverblöcken hinzuzufügen.Nachdem ich so viel Zeit mit Hunderten von ähnlichen Fällen verbracht habe, habe ich mir den folgenden Ausschnitt ausgedacht. Es ist kurz und kann leicht an alles angepasst werden.
Ja, das kann sein. Aber es gibt einen Grund und sollte denen, die wissen, wie man es richtig benutzt, keinen Schaden zufügen. ;)
quelle
Ich ziehe es vor, mit einem Antwortcode zurückzukehren, damit der Browser weiß, dass Sie ihn zu einer anderen URL umleiten.
dann blockiert eine andere Serverkonfiguration für den
https
quelle
Wie wäre es, einen Serverblock für diesen Zweck zu erstellen:
Starten Sie dann nginx neu
quelle
https://www.example.com
zu kümmernhttps://example.com
.Ich denke das sollte funktionieren.
In Ihrer normalen HTTP-Serverdefinition hat anthonysomerset Folgendes vorgeschlagen:
Dann auf Ihrer SSL-Serverdefinition:
Auf diese Weise sollte die Weiterleitung nur einmal pro Anfrage erfolgen, unabhängig davon, zu welcher URL der Benutzer ursprünglich wechselt.
quelle
if ($host = 'www.example.com') {
da Ihr Regex für mich nicht funktionierte. Keine Ahnung warum, da es richtig aussieht.Hier ist das vollständige Beispiel, das für mich funktioniert hat. Das Problem war, dass ich die SSL-Details (
ssl_certificate
usw.) nicht im WWW- Umleitungsblock hatte. Denken Sie daran, Ihre Protokolle zu überprüfen (sudo tail -f /var/log/nginx/error.log
)!quelle