Der-Dennis: mod_rewrite Umleitung von Nicht-www auf www

Hallo zusammen,

irgendwie werde ich mit Apaches mod_rewrite nicht wirklich warm. Ich habe folgendes in meiner .htaccess-Datei:

  
RewriteEngine On  
  
RewriteBase /  
  
RewriteCond %{HTTP_HOST} ^plattenkonferenz\.net$ [NC]  
RewriteRule ^(.*)$ http://www.plattenkonferenz.net/$1 [R=301,L]  
  
RewriteCond %{REQUEST_FILENAME} -s [OR]  
RewriteCond %{REQUEST_FILENAME} -l [OR]  
RewriteCond %{REQUEST_FILENAME} -d  
RewriteRule ^.*$ - [NC,L]  
RewriteRule ^.*$ index.php [NC,L]  

Das funktioniert auch super. Nur möchte ich nun gerne die erste RewriteCondition und -Rule dahingehend verändern, dass der Name der Domain "dynamisch" ist, sprich ich in diesem Fall nicht plattenkonferenz.net angeben muss, sondern dass die RewriteEngine selbst den Namen der Domain erkennt. So könnte ich ohne Anpassung der .htaccess diese Datei unverändert für verschiedene Domains nutzen.

Meine Frage hierzu: Ist so etwas möglich? Und wenn ja, wie? Außerdem wäre es für mich interessant zu wissen, ob so etwas sinnvoll ist?

Bei meiner Netz-Suche bin ich bisher nur auf oben genannte Möglichkeit gestoßen.

Gruß und vielen Dank,
Dennis

  1. Meine Frage hierzu: Ist so etwas möglich? Und wenn ja, wie?

    Indem du in der RewriteCond den Hostnamen als Ausdruck definierst und ihn in der Rule wieder einbaust - aber nur, wenn er nicht mit www. beginnt.

    Außerdem wäre es für mich interessant zu wissen, ob so etwas sinnvoll ist?

    Zu welchem Zweck sinnvoll?

    um dir bei 20 Domains (+ die jeweilige Subdomain) 40 Zeilen zu sparen und nur mit zwei auszukommen, Ja - dann ist es sinnvoll.

    Die www-Subdomain zu forcieren ist allgemein wenig sinnvoll, ich würde es umgekehrt machen (siehe no-www).

    1. Hallo suit,

      erst einmal vielen Dank für Deine Antwort.

      Indem du in der RewriteCond den Hostnamen als Ausdruck definierst und ihn in der Rule wieder einbaust - aber nur, wenn er nicht mit www. beginnt.

      Ich hab jetzt folgendes probiert:

        
      RewriteCond %{HTTP_HOST} ^[^(www\.)](.+)$ [NC]  
      RewriteRule ^(.*)$ http://www\.%1/$1 [R=301,L]  
      
      

      Ich weiß, ich muss mich noch mehr mit RegEx auseinandersetzen. Aber kannst Du mir erklären, wo der Fehler ist? In diesem Fall wird aus http://example.org http://www.xample.org. Das erste Zeichen der Domain wird also "verschluckt".

      Zu welchem Zweck sinnvoll?

      um dir bei 20 Domains (+ die jeweilige Subdomain) 40 Zeilen zu sparen und nur mit zwei auszukommen, Ja - dann ist es sinnvoll.

      Ja, dazu war es gedacht.

      Die www-Subdomain zu forcieren ist allgemein wenig sinnvoll, ich würde es umgekehrt machen (siehe no-www).

      Das finde ich sehr interessant. Darüber hab ich mir bisher noch gar keine Gedanken gemacht. Ich werde jetzt auf jeden Fall http://example.org und http://www.example.org zulassen (ist schon passiert :-), zu bestaunen unter http://plattenkonferenz.net). Meine Frage hat sich damit soweit erledigt.

      Aber über eine Lösung des oben genannten Problems würde ich mich trotzdem freuen. Erstens, weil ich dann vielleicht mal was besser mit RegEx klarkomme und zweitens hat vielleicht jemand Ähnliches vor.

      Gruß, Dennis

      1. Hi,

        RewriteCond %{HTTP_HOST} [1](.+)$ [NC]
        RewriteRule ^(.*)$ http://www.%1/$1 [R=301,L]

        
        >   
        > Ich weiß, ich muss mich noch mehr mit RegEx auseinandersetzen. Aber kannst Du mir erklären, wo der Fehler ist? In diesem Fall wird aus http://example.org http://www.xample.org. Das erste Zeichen der Domain wird also "verschluckt".  
          
        Die eckigen Klammern definieren eine Zeichenklasse.  
        Du verlangst also mit deinem Ausdruck, dass der HTTP\_HOST mit einem Zeichen beginnen soll, dass keine (, kein w, kein w, kein w, kein \, kein Punkt und keine ) sein soll. (Die Sonderbedeutung der meisten Sonderzeichen, wie bspw. des Punktes, ist innerhalb einer Zeichenklasse aufgehoben - deshalb ist der \ dort m.W. auch kein maskierendes Zeichen.)  
          
        Nun, example.com erfüllt das - das e ist ein Zeichen, dass nicht in dieser Zeichenklasse liegt. Und der nach diesem Zeichen folgende Rest ist xample.com - der wird jetzt von (.+) gematcht, und wegen der Klammerung als %1 zurückgeliefert.  
          
        MfG ChrisB  
          
        
        -- 
        RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
        

        1. ^(www.) ↩︎

        1. Die eckigen Klammern definieren eine Zeichenklasse.

          Eine Zeichenklasse ist auch nicht dafür geeignet - um bestimmte voran- oder nachgestellte Ausdrücke zu bedingen gibt es lookahead und lookbehind assertions. In dem Fall eine negative lookbehind assertion:

          ^(?<!www.)example.com$

          Einem zu findenden example.com darf nicht www. vorangestellt sein - die assertions sind übrigens immer non-capturing.

          Manchmal ist es aber einfach besser nicht alles in einzelne ausdrücke zu verpacken - eine zweite RewriteCond voranzustellen ist wesentlich einfacher zu lesen:

          RewriteCond %{HTTP_HOST} !^www.
          RewriteCond %{HTTP_HOST} ^(.+)$ [NC]
          RewriteRule ^(.*)$ http://www.%1/$1 [R=301,L]

          1. Hi,

            Manchmal ist es aber einfach besser nicht alles in einzelne ausdrücke zu verpacken - eine zweite RewriteCond voranzustellen ist wesentlich einfacher zu lesen:

            RewriteCond %{HTTP_HOST} !^www.
            RewriteCond %{HTTP_HOST} ^(.+)$ [NC]
            RewriteRule ^(.*)$ http://www.%1/$1 [R=301,L]

            Die zweite Condition, nur um den Hostnamen zu bekommen, braucht man dabei m.W. auch nicht - auch im Substituion-Part der RewriteRule sollte sich %{HTTP_HOST} direkt einsetzen lassen.

            MfG ChrisB

            --
            RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
          2. Hallo suit, hallo Chris,

            noch einmal vielen Dank für Eure Hilfe.

            RewriteCond %{HTTP_HOST} !^www.
            RewriteCond %{HTTP_HOST} ^(.+)$ [NC]
            RewriteRule ^(.*)$ http://www.%1/$1 [R=301,L]

            Das funktioniert einwandfrei. Auch wenn ich wie im vorigen Post geschrieben darauf (aus hoffentlich gutem Grund) verzichten werde.

            Außer bei den [OR]-Verknüpfungen hab ich noch nie etwas getrennt. Gut zu wissen, dass so etwas auch geht.

            Hab die grad die ganze Zeit versucht, das von suit oben beschriebene hinzubekommen. Mein letzter Ansatz war übrigens:

              
            RewriteCond %{HTTP_HOST} !^(www\.)$^(.+)$ [NC]  
            RewriteRule ^(.*)$ http://www\.%2/$1 [R=301,L]  
            
            

            Natürlich ohne Erfolg.

            Dass [irgendwas] Zeichenklassen definieren ist mir zwar bekannt, wird von mir aber regelmäßig vergessen...

            Wie gesagt, werd' mich noch mehr mit RegEx auseinander setzen müssen.

            Gruß, Dennis

            1. Hi,

              Hab die grad die ganze Zeit versucht, das von suit oben beschriebene hinzubekommen. Mein letzter Ansatz war übrigens:

              RewriteCond %{HTTP_HOST} !^(www.)$^(.+)$ [NC]
              RewriteRule ^(.*)$ http://www.%2/$1 [R=301,L]

              
              >   
              > Natürlich ohne Erfolg.  
                
              In dem Ausdruck in der Condition verlangst du ja, dass der HTTP\_HOST einem bestimmten Muster \*nicht\* entsprechen soll. Dann aber anschließend in der Rule noch Matches aus diesem \*nicht\* zutreffenden Muster verwenden zu wollen, haut logisch nicht so besonders gut hin.  
                
              MfG ChrisB  
                
              
              -- 
              RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
              
              1. Hey Chris,

                nochmals danke für den Hinweis. War die letzten Tage nicht online, deshalb kommt meine Antwort etwas verspätet.

                Ich melde mich, wenn ich mal wieder Probleme mit RexEx habe ;-) Ansonsten versuch ich mich jetzt erstmal wieder mehr mit der Materie zu beschäftigen.

                Gruß, Dennis