Moin!
Bis heute habe ich das Wegfallen des 'www' beim Aufruf der Domain so gelöst:
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www.example.com$ [NC]
RewriteRule ^(.*)$ http://example.com/$1 [R=301,L]Das funktioniert auch. Kommen aber weitere mod_rewrite Geschehnisse dazu und die .hataccess wird umfangreicher, dann gibt es immer mehr Probleme. (Z.B. Stichwort Fremdverlinkung von Bildern)
Nun habe ich heute beim Googeln die Seite DARING FIREBALL - Using .htaccess Redirection to Standardize Web Server Addresses gefunden, auf der die Streichung des 'www' mit simplerem Code geschieht:
RewriteEngine on
RewriteBase /
RewriteCond %{HTTP_HOST} ^www.example.com$
RewriteRule (.*) http://example.com/$1 [R=Permanent]
Spannend, dass du vier Zeilen (im Vergleich zu drei) mit mehr Zeichen pro Zeile als "simpler" betitelst.
Deine obere Lösung ist jedenfalls in der Hinsicht falsch, dass du die Punkte im Domainnamen in der RewriteCond nicht escapest - auf diese Weise wirken sie als Platzhalter für "jedes beliebige Zeichen" - das ist technisch nicht korrekt und gehört korrigiert.
Weiterhin hört deine obere Lösung nach der Ausgabe des Redirects sofort auf, weitere Regeln anzuwenden. Das ist im Prinzip nicht falsch, denn was könnte man danach mit der im Browser immer noch ursprünglichen URL MIT WWW denn noch umschreiben?
Insofern: Deine Beobachtung, dass es zu Problemen kommt, mag nicht falsch sein, aber anstatt irgendwas in deinem Rewriting zu ändern (wobei sich nichts ändert, außer dem L-Parameter für das Beenden des Rewriting nach dieser Regel), solltest du lieber erstmal die auftretenden Fehler analysieren und beschreiben.
Wenn ich _diese_ Lösung verwende, habe ich mit all den anderen mod_rewrite Geschehnissen viel weniger Probleme. (Was ich damit sagen will: Es kommt z.B. zu weniger Internal Server Errors.)
1.) Ist die erste Möglichkeit die "schlechtere"? Wieso gibt es da mehr Probleme damit als bei der zweiten Lösung?
Siehe oben.
2.) Was ist denn in der RewriteRule-Zeile der Unterschied zwischen ^(.*)$ und (.*) am Beginn? Was genau bedeuten diese 2 EInleitungen in dieser Zeile?
^ steht für den Stringanfang, $ für das Stringende. Es gibt im Ergebnis zwischen den beiden Ausdrücken ^(.*)$ (nimm alle beliebigen Zeichen zwischen Anfang und Ende) und (.*) (nimm alle beliebigen Zeichen, und zwar möglichst viele davon) keinen Unterschied: Alle werden immer den gesamten String finden.
3.) Gibt es eine empfehlenswerte Seite auf Deutsch, die mich in das Thema einführt?
Keine Ahnung, ob es die gibt. Das Manual vom Apache ist leider nicht auf deutsch erhältlich im Moment.
Wie gesagt, ich habe ja nicht wirklich ein "Problem". Das, was ich will, nämlich den Wegfall des 'www' funktioniert ja. Mit beiden Lösungen. Aber es stört mich einfach, dass ich da was mache/was verwende, was ich eigentlich gar nicht verstehe. Nicht mal ansatzweise. Und da ich nicht blind was kopieren möchte, was mir ein anderer vorgesetzt hat, würd ich gerne wissen und verstehen, was da eigentlich passiert.
Dann lerne mal zuallererst reguläre Ausdrücke. Wenn du die nicht kannst, dann ist jeder Versuch, Rewriting zu erlernen, zum Scheitern verurteilt.
- Sven Rautenberg