Nginx, die nicht-www-vorgefertigte Domäne in die www-vorgefertigte Domäne umschreibt
-
06-07-2019 - |
Frage
Ich sehe den nginx Httprewritemodule -Dokumentation Hat ein Beispiel, um eine www-vorgefertigte Domäne in eine nicht www-vorgefertigte Domäne umzuschreiben:
if ($host ~* www\.(.*)) {
set $host_without_www $1;
rewrite ^(.*)$ http://$host_without_www$1 permanent; # $1 contains '/foo', not 'www.mydomain.com/foo'
}
Wie kann ich das Gegenteil machen-schreiben Sie eine nicht www-vorgefertigte Domäne in eine www-vorgefertigte Domäne um? Ich dachte, ich könnte vielleicht so etwas wie das Folgende machen, aber Nginx mag die verschachtelte wenn auch nicht.
if ($host !~* ^www\.) { # check if host doesn't start with www.
if ($host ~* ([a-z0-9]+\.[a-z0-9]+)) { # check host is of the form xxx.xxx (i.e. no subdomain)
set $host_with_www www.$1;
rewrite ^(.*)$ http://$host_with_www$1 permanent;
}
}
Außerdem wollte ich, dass dies für einen Domain -Namen funktioniert, ohne Nginx explizit zu sagen, dass Domain1.com -> www.domain1.com, Domain2.com -> www.domain2.com usw. usw., da ich eine große Anzahl von Domänen zum Umschreiben habe .
Lösung 3
Nun, ich denke, ich brauche die äußere "wenn" -Anweisung nicht wirklich, da ich sowieso nur nach Domänen des Formulars xxx.xxx prüfe. Die folgenden Funktionen für mich, obwohl es nicht robust ist. Lassen Sie mich wissen, ob es eine bessere Lösung gibt.
if ($host ~* ^([a-z0-9\-]+\.(com|net|org))$) {
set $host_with_www www.$1;
rewrite ^(.*)$ http://$host_with_www$1 permanent;
}
Bearbeiten: Der reguläre Ausdruck hat Bindestrich hinzugefügt, da es sich um ein gültiges Zeichen in einem Hostnamen handelt.
Andere Tipps
Wie in der Nginx -Dokumentation erwähnt, sollten Sie die Verwendung der Verwendung der Verwendung vermeiden if
Richtlinie in Nginx, wo möglich, denn sobald du eine hast if
In Ihrer Konfiguration muss Ihr Server jede einzelne Anfrage bewerten, um zu entscheiden, ob Sie damit übereinstimmen möchten if
oder nicht.
Eine bessere Lösung wären mehrere Serveranweisungen.
server {
listen 80;
server_name website.com;
return 301 $scheme://www.website.com$request_uri;
}
server {
listen 80;
server_name www.website.com;
...
}
Wenn Sie versuchen, eine SSL (HTTPS) -Fabrik -Site zu servieren, haben Sie mehr oder weniger drei verschiedene Optionen.
- Richten Sie mehrere IP -Adressen ein, wobei jede Serveranweisung von seiner eigenen IP (oder unterschiedlichen Ports zuhören, wenn dies eine Option für Sie ist). Diese Option benötigt SSL -Zertifikate für beide Website.com und www.website.com, Entweder Sie haben ein Wild Card -Zertifikat, ein UNI -Zertifikat (mehrere Domains) oder nur zwei verschiedene Zertifikate.
- Schreiben Sie das Umschreiben in der Anwendung.
- Benutze das gefürchtete
if
Richtlinie.
if ($host !~* ^www\.) {
rewrite ^(.*)$ http://www.$host$1 permanent;
}
if ($host ~* ^[^.]+\.[^.]+$) {
rewrite ^(.*)$ http://www.$host$1 permanent;
}
Es ist nur möglich, gültige Hostnamen zu erhalten, da die Anfrage es sonst niemals an Ihren Server schafft. Daher müssen Sie keine eigene Validierungslogik erstellen.
Die Nginx -Dokumentation warnt vor der Verwendung von if for for Rewriting. Bitte siehe den Link hier: http://wiki.nginx.org/pitfalls#server_name
Http & https ohne if Bedingungen:
server {
listen 80;
listen 443;
server_name website.com;
return 301 $scheme://www.website.com$request_uri;
}
server {
listen 80;
listen 443 default_server ssl;
server_name www.website.com;
# Your config goes here #
}