301-Weiterleitung per .htaccess
Mr. Wolf
- htaccess
- webserver
Guten Tag,
wieder einmal könnte ich Hilfe gebrauchen. Folgendes Problem: Ich habe eine Website neu aufgesetzt und dabei auch einige Unterseiten neu organisiert. Als diese online ging, habe ich auch noch das HTTPS-Protokoll aktiviert. Funktioniert auch alles.
In diesem Zusammenhang habe ich auch in der .htaccess die Weiterleitung auf die neue Adresse (mit https und www) angelegt:
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\. [NC,OR]
RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]
Funktioniert ebenfalls.
Nun möchte ich aber für die neugeordneten Seiten möglichst das Google-Ranking retten. Wenn ich über Google nach "site:example.com" suche, finde ich z. B.
"www.example.com/altes-verzeichnis"
Nun möchte ich aber gleich auf
"https://www.example.com/neues-verzeichnis/"
umleiten. Wenn ich die Regeln für die 301-Weiterleitung per .htaccess aber richtig verstanden habe, dann ist die Syntax: alter RELATIVER Pfad → neuer ABSOLUTER Pfad. Meine Frage: Wie muss die neue Zeile in der .htaccess aussehen, um gleich auf die korrekte https-Seite umzuleiten?
Ich danke schon mal für Eure Anregungen und Gedanken.
Gruß Wolf
Guten Tag,
wieder einmal könnte ich Hilfe gebrauchen. Folgendes Problem: Ich habe eine Website neu aufgesetzt und dabei auch einige Unterseiten neu organisiert. Als diese online ging, habe ich auch noch das HTTPS-Protokoll aktiviert. Funktioniert auch alles.
In diesem Zusammenhang habe ich auch in der .htaccess die Weiterleitung auf die neue Adresse (mit https und www) angelegt:
RewriteEngine On RewriteCond %{HTTP_HOST} !^www\. [NC,OR] RewriteCond %{SERVER_PORT} !^443$ RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]
Funktioniert ebenfalls.
Nun möchte ich aber für die neugeordneten Seiten möglichst das Google-Ranking retten. Wenn ich über Google nach "site:example.com" suche, finde ich z. B.
"www.example.com/altes-verzeichnis"
Nun möchte ich aber gleich auf
"https://www.example.com/neues-verzeichnis/"
RewriteEngine On
## Speziellere Einstellungen weiter oben…
# 1. Umleitung für das Verzeichnis:
RewriteCond %{HTTP_HOST} !^www\. [NC,OR]
RewriteCond %{HTTPS}=off
RewriteRule ^/altes-verzeichnis/(*)$ https://www.example.com/neues-verzeichnis/$1 [R=301,L]
## Die RewriteCond gilt immer nur einmal, deshalb nochmal für Zugriffe, die via HTTPS und mit "www" davor aber der alten Ressource kommen:
# 2. Umleitung für das alte Verzeichnis:
RewriteRule ^/altes-verzeichnis/(*)$ https://www.example.com/neues-verzeichnis/$1 [R=301,L]
## Die RewriteCond gilt immer nur einmal, deshalb neu setzen:
# 3. Umleitung bei fehlendem www oder Zugriff ohne Verschlüsselung
RewriteCond %{HTTP_HOST} !^www\. [NC,OR]
RewriteCond %{HTTPS}=off
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]
Port 443 bedeutet zwar "meistens" aber nicht "zwingend", dass HTTPS verwendet wird.
Hello,
wieder einmal könnte ich Hilfe gebrauchen. Folgendes Problem: Ich habe eine Website neu aufgesetzt und dabei auch einige Unterseiten neu organisiert. Als diese online ging, habe ich auch noch das HTTPS-Protokoll aktiviert. Funktioniert auch alles.
In diesem Zusammenhang habe ich auch in der .htaccess die Weiterleitung auf die neue Adresse (mit https und www) angelegt:
RewriteEngine On RewriteCond %{HTTP_HOST} !^www\. [NC,OR] RewriteCond %{SERVER_PORT} !^443$ RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]
Funktioniert ebenfalls.
Nun möchte ich aber für die neugeordneten Seiten möglichst das Google-Ranking retten. Wenn ich über Google nach "site:example.com" suche, finde ich z. B.
"www.example.com/altes-verzeichnis"
Nun möchte ich aber gleich auf
"https://www.example.com/neues-verzeichnis/"
RewriteEngine On ## Speziellere Einstellungen weiter oben… # 1. Umleitung für das Verzeichnis: RewriteCond %{HTTP_HOST} !^www\. [NC,OR] RewriteCond %{HTTPS}=off RewriteRule ^/altes-verzeichnis/(*)$ https://www.example.com/neues-verzeichnis/$1 [R=301,L] ## Die RewriteCond gilt immer nur einmal, deshalb nochmal für Zugriffe, die via HTTPS und mit "www" davor aber der alten Ressource kommen: # 2. Umleitung für das alte Verzeichnis: RewriteRule ^/altes-verzeichnis/(*)$ https://www.example.com/neues-verzeichnis/$1 [R=301,L] ## Die RewriteCond gilt immer nur einmal, deshalb neu setzen: # 3. Umleitung bei fehlendem www oder Zugriff ohne Verschlüsselung RewriteCond %{HTTP_HOST} !^www\. [NC,OR] RewriteCond %{HTTPS}=off RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]
Port 443 bedeutet zwar "meistens" aber nicht "zwingend", dass HTTPS verwendet wird.
Außerdem wäre "443" eine Umleitung mit Hilfe von Layer 4 OSI. Man sollte aber besser in derselben Protokollschicht bleiben (Layer 5 bis 7 OSI) und nicht übergriffig werden.
Werden denn so wie oben auch die Request-Parameter weitergereicht? Müsste da nicht noch ein Rewriteparameter hinzugenommen werden?
Glück Auf
Tom vom Berg
Werden denn so wie oben auch die Request-Parameter weitergereicht? Müsste da nicht noch ein Rewriteparameter hinzugenommen werden?
Ja. ^(.*)$
"matcht" die GET-Parameter(!) mit. Werden andere erwartet, dann mit QSR
Test mit:
RewriteRule ^(.*)$ https://%{SERVER_NAME}%{REQUEST_URI}/$1 [END,R=permanent]
http://code.fastix.org/search.php?q=phpinfo&suchTyp=text
Für weitere Formulardaten (POST, FILES) wäre aber:
RewriteRule ^(.*)$ https://%{SERVER_NAME}%{REQUEST_URI}/$1 [END, QSR, R=permanent]
erforderlich. Das ist aber eher selten (Formulare auf externen Webseiten oder nicht umgestellte API-Nutzung) der Fall. Da sollte man wegen der doppelten Requests irgendwann auch einen Schlussstrich ziehen.
Hello,
ich dachte an diese Beschreibung
Glück Auf
Tom vom Berg
hallo
Werden denn so wie oben auch die Request-Parameter weitergereicht?
Ja.
^(.*)$
"matcht" die GET-Parameter(!) mit. Werden andere erwartet, dann mit QSR
Soll das heissen
POST example.org?par=value
wird anders behandelt als
GET example.org?par=value
??
Ein Query-String ist doch ein Query-String, egal ob die Methode POST oder GET ist.
Also, ich habe nachgelesen
When the replacement URI contains a query string, the default behavior of RewriteRule is to discard the existing query string, and replace it with the newly generated one. Using the [QSA] flag causes the query strings to be combined.
Übersetzt:
Das voreingestellte Verhalten ist, dass der existierende Query-String vergessen und durch den neu generierten Query-String ersetzt wird.
Mein Zeug mit POST und Files war also Unsinn!
Das Erzeugen eines neuen Query-Strings geschieht, wenn man folgendes tut:
RewriteRule ^/orte/(.*)/(.*) /orte.php?ort=$1&ot=$2
Aber auch schon bei:
RewriteRule ^(.*)$ htts://www.example.com/$1 [END,R=permanent]
Beispiel:
http://example.com/orte/berlin/lichtenberg
würde zu:
http://example.com/orte.php?ort=berlin&ot=lichtenberg
Bis hierher wäre alles gut. Will man hier aber tatsächlich:
http://example.com/orte/berlin/lichtenberg?foo=bar
zu
/orte.php?ort=berlin&ot=lichtenberg&foo=bar
verwandeln lassen, dann ist das QSA notwendig:
RewriteRule ^/orte/(.*)/(.*) /orte.php?ort=$1&ot=$2 [QSA]
POST, COOKIES (+SESSION), FILES
Diese Daten (Für die SESSION: Nur das Cookie!) bleiben unverändert bzw. werden beim angeforderten Redirect stets neu gesendet. (Ausnahmen können bestehen wenn beim Redirect ein Downgrade von HTTPS zu HTTP erfolgt!)
Hallo ursus,
danke für die schnelle und umfassende Hilfe. Allerdings erzeugt
RewriteCond %{HTTPS}=off
bei mir einen 500-Fehler. Allerdings funktioniert
RewriteCond %{HTTPS} off
Weiterhin erzeugt bei mir
RewriteRule ^/altes-verzeichnis/(*)$ https://www.example.com/neues-verzeichnis/$1 [R=301,L]
ebenfalls einen 500-Fehler. Kann es sein, dass (*) nicht ganz korrekt ist?
Gruß Wolf
Hi,
RewriteRule ^/altes-verzeichnis/(*)$ https://www.example.com/neues-verzeichnis/$1 [R=301,L]
ebenfalls einen 500-Fehler. Kann es sein, dass (*) nicht ganz korrekt ist?
da fehlt der Punkt für beliebiges Zeichen. Nur der * für "egal wie oft" ist etwas wenig.
cu,
Andreas a/k/a MudGuard
da fehlt der Punkt für beliebiges Zeichen. Nur der * für "egal wie oft" ist etwas wenig.
Stimmt. Ich fasse zusammen:
RewriteEngine On
## Speziellere Einstellungen weiter oben…
# 1. Umleitung für das Verzeichnis:
RewriteCond %{HTTP_HOST} !^www\. [NC,OR]
RewriteCond %{HTTPS}=off
RewriteRule ^/ALTES/(.*)$ https://www.example.com/NEUES/$1 [R=301,L]
## Die RewriteCond gilt immer nur einmal, deshalb nochmal für Zugriffe, die via HTTPS und mit "www" davor aber mit der alten Ressource kommen:
# 2. Umleitung für das alte Verzeichnis:
RewriteRule ^/ALTES/(.*)$ https://www.example.com/NEUES/$1 [R=301,L]
## Die RewriteCond gilt immer nur einmal, deshalb neu setzen:
# 3. Umleitung bei fehlendem www oder Zugriff ohne Verschlüsselung auf alle anderen URLS:
RewriteCond %{HTTP_HOST} !^www\. [NC,OR]
RewriteCond %{HTTPS}=off
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]
Hallo ursus,
ich danke für deine Mühe, du hast mir sehr geholfen!
Gruß Wolf