Weiterleitungen erhalten Besucher und Suchranking, wenn eine Seite umzieht, Sie die Domain wechseln oder HTTPS erzwingen. Diese Anleitung zeigt, wie Sie saubere Nginx-Weiterleitungen auf Ihrem VPS Linux Infrawire schreiben und testen, bevor sie live gehen.
📋 Voraussetzungen
- Ein Linux-VPS (Ubuntu 24.04 / Debian 12 oder AlmaLinux 9 / Rocky 9) mit SSH-Root-Zugang. IP und Root-Passwort finden Sie in Ihrem Kundenbereich.
- Nginx ist installiert und liefert mindestens eine Website aus (
sudo apt install nginxodersudo dnf install nginx). - Ein Domainname (
example.com), dessen DNS-Einträge A/AAAA aufVPS_IPzeigen.
🧭 301 oder 302: welche Wahl
- 301 (Moved Permanently): Der Umzug ist endgültig. Browser und Suchmaschinen speichern ihn und übertragen das Ranking auf die neue URL.
- 302 (Found): Der Umzug ist vorübergehend (Wartung, A/B-Test). Die alte URL bleibt maßgeblich.
Im Zweifel starten Sie mit 302: Ein falsches 301 kann lange im Browser-Cache bleiben.
⚙️ return oder rewrite
Bevorzugen Sie return: Es ist schneller und lesbarer, weil Nginx die Verarbeitung sofort beendet.
Nginxlocation = /old-page { return 301 /new-page; }
Nutzen Sie rewrite nur, wenn Sie einen Teil der URL per regulärem Ausdruck erfassen müssen:
Nginxrewrite ^/blog/(\d+)/(.*)$ /articles/$2 permanent;
Das Flag permanent sendet ein 301, redirect ein 302.
🌐 www auf non-www weiterleiten
Legen Sie einen eigenen Server-Block an, der nur weiterleitet. Bearbeiten Sie /etc/nginx/sites-available/example.com (Debian/Ubuntu) oder /etc/nginx/conf.d/example.com.conf (AlmaLinux/Rocky):
Nginx1server { 2 listen 80; 3 listen [::]:80; 4 server_name www.example.com; 5 return 301 $scheme://example.com$request_uri; 6}
Für die Gegenrichtung tauschen Sie die beiden Hostnamen. $request_uri behält Pfad und Query-String.
🔒 HTTP auf HTTPS weiterleiten
Sobald ein Zertifikat installiert ist, schicken Sie den gesamten Klartext-Verkehr auf HTTPS:
Nginx1server { 2 listen 80; 3 listen [::]:80; 4 server_name example.com www.example.com; 5 return 301 https://example.com$request_uri; 6} 7 8server { 9 listen 443 ssl; 10 listen [::]:443 ssl; 11 http2 on; 12 server_name www.example.com; 13 ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; 14 ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; 15 return 301 https://example.com$request_uri; 16}
Die eigentliche Website liegt dann in einem dritten Block, der auf 443 mit server_name example.com; lauscht. http2 on; erfordert Nginx 1.25.1 oder neuer, was unter Ubuntu 24.04 der Fall ist.
🔗 Alte URL auf neue URL
Für wenige Seiten nutzen Sie exakte Treffer (=), die am schnellsten sind:
Nginxlocation = /about-us.html { return 301 /about; } location = /promo { return 302 /offers/current; }
Für einen verschobenen Ordner mit Beibehaltung der Unterpfade:
Nginxlocation /docs/ { rewrite ^/docs/(.*)$ /help/$1 permanent; }
🏠 Eine ganze Domain weiterleiten
Wenn Sie old-example.com zugunsten von example.com aufgeben, behalten Sie alle Pfade:
Nginx1server { 2 listen 80; 3 listen [::]:80; 4 server_name old-example.com www.old-example.com; 5 return 301 https://example.com$request_uri; 6}
Hat die alte Domain auch HTTPS, fügen Sie einen passenden listen 443 ssl;-Block mit eigenem Zertifikat hinzu, sonst zeigen Browser vor der Weiterleitung einen Zertifikatsfehler.
✅ Testen und sauber neu laden
Prüfen Sie immer zuerst die Syntax. Ein Reload erhält laufende Verbindungen, ein Restart nicht.
Bashsudo nginx -t sudo systemctl reload nginx
Prüfen Sie dann die Header, ohne der Weiterleitung zu folgen:
Bashcurl -I http://www.example.com/old-page
Erwartete Ausgabe (gekürzt):
HTTP/1.1 301 Moved Permanently
Server: nginx
Location: https://example.com/old-page
Mit curl -IL http://www.example.com/old-page folgen Sie der ganzen Kette und sehen jeden Schritt. Ideal ist ein einziger Schritt: Vermeiden Sie Ketten wie HTTP, dann www, dann HTTPS.
🛠️ Fehlerbehebung
Zu viele Weiterleitungen (Schleife). Eine Regel trifft auf ihr eigenes Ziel, oft weil ein Proxy oder CDN HTTPS bereits terminiert. Prüfen Sie den Location-Header mit curl -I und stellen Sie sicher, dass der Zielblock nicht erneut weiterleitet.
Die Änderung wirkt nicht. Sie haben eine nicht aktivierte Datei bearbeitet. Prüfen Sie unter Debian/Ubuntu den Link in /etc/nginx/sites-enabled/ und führen Sie sudo nginx -t und sudo systemctl reload nginx aus. Browser cachen auch 301: Testen Sie mit curl oder einem privaten Fenster.
Query-String verloren. Bei rewrite ... ? oder festem Ziel verschwinden Parameter. Nutzen Sie $request_uri in return oder behalten Sie $args ausdrücklich bei.
Falscher Block antwortet. Nginx wählt den Block nach server_name. Listen Sie sie mit sudo nginx -T | grep server_name auf und suchen Sie Duplikate.
🎉 Ihre Weiterleitungen sind aktiv: dauerhaft, wo es endgültig ist, temporär, wo nicht, und mit curl getestet, bevor Ihre Besucher etwas merken.