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 .

War es hilfreich?

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.

  1. 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.
  2. Schreiben Sie das Umschreiben in der Anwendung.
  3. Benutze das gefürchtete if Richtlinie.

Es gibt auch die Möglichkeit, SNI zu verwenden, aber ich bin mir nicht sicher, ob dies ab sofort vollständig unterstützt wird.

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 #
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top