Ich verwende Nginx in der Rackspace-Cloud nach einem Tutorial und habe das Internet durchsucht und kann dies bisher nicht sortieren.
Ich möchte, dass www.mysite.com aus SEO- und anderen Gründen wie gewohnt in .htaccess zu mysite.com wechselt.
Meine /etc/nginx/sites-available/www.example.com.vhost config:
server {
listen 80;
server_name www.example.com example.com;
root /var/www/www.example.com/web;
if ($http_host != "www.example.com") {
rewrite ^ http://example.com$request_uri permanent;
}
Ich habe es auch versucht
server {
listen 80;
server_name example.com;
root /var/www/www.example.com/web;
if ($http_host != "www.example.com") {
rewrite ^ http://example.com$request_uri permanent;
}
Ich habe es auch versucht. Beide zweiten Versuche führen zu Umleitungsschleifenfehlern.
if ($host = 'www.example.com' ) {
rewrite ^ http://example.com$uri permanent;
}
Mein DNS ist standardmäßig eingerichtet:
site.com 192.192.6.8 A type at 300 seconds
www.site.com 192.192.6.8 A type at 300 seconds
(Beispiel-IPs und -Ordner wurden als Beispiele verwendet, um Menschen in Zukunft zu helfen.) Ich benutze Ubuntu 11.
Dashboard > Settings > General Settings
und stellen Sie sicher, dasswww
die URLs der WordPress-Adresse / Site-Adresse keine enthalten . Unabhängig davon, wie Sie Ihren Nginx konfigurieren, wird ein WWW in diesen URLs zu dem mit dem WWW umgeleitet.Antworten:
HTTP-Lösung
Aus der Dokumentation geht hervor , dass "der richtige Weg darin besteht, einen separaten Server für example.org zu definieren":
HTTPS-Lösung
Für diejenigen, die eine Lösung suchen, einschließlich
https://
...Hinweis: Ich habe
https://
meine Lösung ursprünglich nicht aufgenommen , da wir Loadbalancer verwenden und unser https: // Server ein stark frequentierter SSL-Zahlungsserver ist. Wir mischen https: // und http: // nicht.Verwenden Sie zum Überprüfen der Nginx-Version
nginx -v
.Entfernen Sie www von der URL mit Nginx Redirect
Sie benötigen also ZWEI Servercodes.
Fügen Sie das www zur URL mit Nginx Redirect hinzu
Wenn Sie das Gegenteil benötigen, um von domain.com zu www.domain.com umzuleiten, können Sie Folgendes verwenden:
Wie Sie sich vorstellen können, ist dies genau das Gegenteil und funktioniert genauso wie im ersten Beispiel. Auf diese Weise erhalten Sie keine SEO-Markierungen, da es sich um eine vollständige Umleitung und Verschiebung von Dauerwellen handelt. Das kein WWW wird erzwungen und das Verzeichnis angezeigt!
Einige meiner unten gezeigten Codes dienen zur besseren Übersicht:
quelle
return 301 $scheme://domain.com$request_uri;
. Es ist nicht erforderlich, Muster zu erfassen, siehe Nginx-FallstrickeEigentlich brauchen Sie nicht einmal ein Umschreiben.
Da meine Antwort immer mehr Stimmen bekommt, aber auch die oben genannten. Sie sollten
rewrite
in diesem Zusammenhang niemals ein verwenden . Warum? Weil nginx eine Suche verarbeiten und starten muss. Wenn Sie verwendenreturn
(was in jeder Nginx-Version verfügbar sein sollte), wird die Ausführung direkt gestoppt. Dies ist in jedem Kontext bevorzugt.Leiten Sie sowohl Nicht-SSL als auch SSL zu ihrem Nicht-WWW-Gegenstück um:
Die
$scheme
Variable enthält nur,http
wenn Ihr Server nur Port 80 überwacht (Standard) und die Option listen dasssl
Schlüsselwort nicht enthält . Wenn Sie die Variable nicht verwenden, erhalten Sie keine Leistung.Beachten Sie, dass Sie bei Verwendung von HSTS noch mehr Serverblöcke benötigen, da die HSTS-Header nicht über unverschlüsselte Verbindungen gesendet werden sollten. Daher benötigen Sie unverschlüsselte Serverblöcke mit Weiterleitungen und verschlüsselte Serverblöcke mit Weiterleitungen und HSTS-Headern.
Leiten Sie alles auf SSL um (persönliche Konfiguration unter UNIX mit IPv4, IPv6, SPDY, ...):
Ich denke, Sie können sich jetzt selbst andere Verbindungen mit diesem Muster vorstellen.
Mehr von meinen Konfigurationen? Geh hier und hier .
quelle
Möglicherweise stellen Sie fest, dass Sie dieselbe Konfiguration für weitere Domänen verwenden möchten.
Das folgende Snippet entfernt www vor einer Domain:
quelle
http
zu$scheme
return ...
undrewrite ... last
". Aktualisierte Links zu Leistungsproblemen?Sie benötigen zwei Serverblöcke.
Fügen Sie diese in Ihre Konfigurationsdatei ein, z
/etc/nginx/sites-available/sitename
Angenommen, Sie entscheiden sich für http://example.com als Hauptadresse verwenden.
Ihre Konfigurationsdatei sollte folgendermaßen aussehen:
Der erste Serverblock enthält die Anweisungen zum Umleiten von Anforderungen mit dem Präfix 'www'. Es lauscht auf Anfragen nach der URL mit dem Präfix 'www' und leitet um.
Sonst macht es nichts.
Der zweite Serverblock enthält Ihre Hauptadresse - die URL, die Sie verwenden möchten. Alle anderen Einstellungen gehen hier wie
root
folgtindex
:location
usw. die Standarddatei für diese anderen Einstellungen Überprüfen Sie im Server - Block enthalten.Der Server benötigt zwei DNS A-Einträge.
Erstellen Sie für IPv6 das Paar AAAA-Einträge mit Ihrer IPv6-Adresse.
quelle
So geht's für mehrere WWW- bis No-WWW-Servernamen (ich habe dies für Subdomains verwendet):
quelle
Best Practice: separat
server
mit fest codiertserver_name
Die beste Vorgehensweise bei Nginx besteht darin,
server
für eine solche Umleitung eine separate zu verwenden (die nicht mit derserver
Hauptkonfiguration geteilt wird), alles fest zu codieren und überhaupt keine regulären Ausdrücke zu verwenden.Es kann auch erforderlich sein, die Domänen fest zu codieren, wenn Sie HTTPS verwenden, da Sie im Voraus wissen müssen, welche Zertifikate Sie bereitstellen.
Verwenden von regulären Ausdrücken innerhalb von
server_name
Wenn Sie über eine Reihe von Websites verfügen und sich nicht für die ultimative Leistung interessieren, aber möchten, dass jede einzelne von ihnen dieselbe Richtlinie in Bezug auf das
www.
Präfix hat, können Sie reguläre Ausdrücke verwenden. Die beste Vorgehensweise bei der Verwendung eines separaten Gerätsserver
würde weiterhin bestehen bleiben.Beachten Sie, dass diese Lösung schwierig wird, wenn Sie https verwenden, da Sie dann über ein einziges Zertifikat verfügen müssen, um alle Ihre Domain-Namen abzudecken, damit dies ordnungsgemäß funktioniert.
non-
www
towww
w / regex in einer dedizierten Singleserver
für alle Sites:www
zu non-www
w / regex in einer dedizierten Singleserver
für alle Sites:www
zu nichtwww
w / regex in einem dediziertenserver
nur für einige Sites :Es kann erforderlich sein, den regulären Ausdruck so einzuschränken, dass er nur einige Domänen abdeckt. Dann können Sie so etwas verwenden, um nur Übereinstimmungen zu erzielen
www.example.org
,www.example.com
undwww.subdomain.example.net
:Testen regulärer Ausdrücke mit Nginx
Sie können testen, ob der reguläre Ausdruck
pcretest
auf Ihrem System wie erwartet funktioniert. Dies ist genau dieselbepcre
Bibliothek, die Ihr Nginx für reguläre Ausdrücke verwendet:Beachten Sie, dass Sie sich keine Gedanken über nachfolgende Punkte oder Groß- und Kleinschreibung machen müssen, da sich nginx bereits darum kümmert, wie es der Nginx-Servername Regex sagt, wenn der "Host" -Header einen nachgestellten Punkt hat .
Mit
if
vorhandenemserver
/ HTTPS bestreuen:Diese endgültige Lösung wird im Allgemeinen nicht als bewährte Methode angesehen, funktioniert jedoch weiterhin und erledigt die Aufgabe.
Wenn Sie HTTPS verwenden, ist diese endgültige Lösung möglicherweise einfacher zu warten, da Sie nicht eine ganze Reihe von SSL-Anweisungen zwischen den verschiedenen
server
Definitionen kopieren und einfügen müssen und stattdessen nur die Snippets darin platzieren können die benötigten Server, um das Debuggen und Verwalten Ihrer Websites zu vereinfachen.nicht
www
zuwww
:www
zu nicht-www
:Hardcodierung einer einzelnen bevorzugten Domäne
Wenn Sie ein bisschen mehr Leistung sowie Konsistenz zwischen mehreren Domänen wünschen, die eine einzelne
server
möglicherweise verwendet, ist es möglicherweise dennoch sinnvoll, eine einzelne bevorzugte Domäne explizit fest zu codieren:Verweise:
quelle
Diese Lösung stammt aus meiner persönlichen Erfahrung. Wir haben mehrere Amazon S3-Buckets und einen Server zum Umleiten
non-www
zuwww
Domänennamen verwendet, um der S3-Headerrichtlinie "Host" zu entsprechen .Ich habe die folgende Konfiguration für den Nginx- Server verwendet:
Dies stimmt mit allen Domainnamen überein, die auf den Server verweisen, beginnend mit was auch immer
www.
und leitet zu weiterwww.<domain>
. Auf die gleiche Weise können Sie die entgegengesetzte Umleitung vonwww
nach durchführennon-www
.quelle
listen 80
Sielisten 443 ssl
und dannssl_certificate
undssl_certificate_key
Anweisungen hinzufügen müssen .listen 443 ssl
mit fehlendem Zertifikat zeigte. Das wird nicht funktionieren und verursacht ernsthafte Kopfschmerzen.Ich habe die beste aller einfachen Antworten ohne fest codierte Domänen kombiniert.
301 permanente Weiterleitung von Nicht-WWW zu WWW (HTTP oder HTTPS):
Wenn Sie Nicht-HTTPS, Nicht-www gegenüber HTTPS bevorzugen, leiten Sie gleichzeitig www um:
quelle
Leiten Sie Nicht-WWW zu WWW um
Für eine einzelne Domain:
Für alle Domänen:
Leiten Sie www zu non-www um. Für eine einzelne Domain:
Für alle Domänen:
quelle
80
und unterscheiden443
?listen
für mich ohne Anweisungen zu funktionieren (nginx 1.4.6).Versuche dies
Anderer Weg: Nginx no-www bis www
und www bis no-www
quelle
Einzigartiges Format:
quelle
server {
server_name "~^www\.(.*)$" ;
return 301 $scheme://$1$request_uri ;
}
quelle
$scheme://www.domain.com$1
um doppelte Schrägstriche zu vermeidenIch bin mir nicht sicher, ob jemand bemerkt, dass es möglicherweise richtig ist, einen 301 zurückzugeben, aber Browser ersticken daran
ist schneller als:
quelle
Geisterblog
Um die von nginx empfohlene Methode für die
return 301 $scheme://example.com$request_uri;
Arbeit mit Ghost zu verwenden, müssen Sie in Ihrem Hauptserverblock Folgendes hinzufügen:quelle
Wenn Sie den Domainnamen nicht fest codieren möchten, können Sie diesen Umleitungsblock verwenden. Die Domain ohne das führende www wird als Variable gespeichert,
$domain
die in der Redirect-Anweisung wiederverwendet werden kann.REF: Umleiten einer Subdomain mit einem regulären Ausdruck in Nginx
quelle
quelle
Wenn Sie Probleme haben, dies zum Laufen zu bringen, müssen Sie möglicherweise die IP-Adresse Ihres Servers hinzufügen. Zum Beispiel:
Dabei ist XXX.XXX.XXX.XXX (offensichtlich) die IP-Adresse.
Hinweis: SSL-CRT und Schlüsselposition müssen definiert werden, um https-Anforderungen ordnungsgemäß umzuleiten
Vergessen Sie nicht, nginx nach den Änderungen neu zu starten:
quelle
/etc/init.d/nginx reload
Sie können auchreload
den Server, der keine Ausfallzeiten verursacht.