Mr. Wolf: 301-Weiterleitung per .htaccess

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

akzeptierte Antworten

  1. 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.

    1. 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

      --
      Es gibt nichts Gutes, außer man tut es!
      Das Leben selbst ist der Sinn.
      1. 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.

        1. Hello,

          ich dachte an diese Beschreibung

          Glück Auf
          Tom vom Berg

          --
          Es gibt nichts Gutes, außer man tut es!
          Das Leben selbst ist der Sinn.
        2. 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.

          1. 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!)

    2. 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

      1. 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

        1. 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]
          
          1. Hallo ursus,

            ich danke für deine Mühe, du hast mir sehr geholfen!

            Gruß Wolf