Hallo,
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www.example.com$ [NC]
RewriteRule ^(.*)$ http://example.com/$1 [R=301,L]RewriteEngine on
RewriteBase /
RewriteCond %{HTTP_HOST} ^www.example.com$
RewriteRule (.*) http://example.com/$1 [R=Permanent]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.
Das heißt also, die 2. Möglichkeit ist besser?
ja, "ist [...] falsch" spricht für mich eine deutliche Sprache. Deine Version führt trotzdem zum gewünschten Ergebnis, weil der Punkt in einem RegEx als Wildcard für "jedes beliebige Zeichen" steht, das schließt einen echten Punkt natürlich mit ein. Somit passt ^www.example.com$ selbstverständlich auf "www.example.com", eber ebensogut auch auf "www4example.com". Ist in deinem Fall nicht relevant, aber ich möchte das Prinzip klarmachen.
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?
Ich nehme an, du meinst das L, richtig? Also soll ich es streichen? Oder stehen lassen?
Stehenlassen, wenn weitere Regeln folgen, die in diesem Schritt nicht mehr relevant sind. Egal, wenn die Regel sowieso die letzte in der .htaccess ist.
Nachfrage: Wenn ich jetzt in der .htaccess weitere Regeln dazuschreibe, also zB. etwas zur Verhinderung einer Fremdverlinkung, muß/soll ich da jedes mal mit "RewriteEngine on" beginnen, oder reicht das _ein_ mal in der .hataccess, nämlich vor dem ersten mod_rewrite Geschehen?
Einmal die Engine anwerfen genügt. Oder versuchst du auch bei jedem Anfahren erst, den Motor erneut anzulassen? ;-)
Oder darf dieses [L] nur nach dem allerletzten mod_rewriting in der .htaccess stehen?
Genau dort ist es sinnlos.
^ steht für den Stringanfang, $ für das Stringende.
Verstehe. Ist das jetzt Wissen über Reguläre Ausdrücke oder Wissen über mod_rewriting?
Ersteres.
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.
OK, aber was ist dann in diesem Zusammenhang richtiger/logischer ... aus der Sichet eines Profis angebrachter?
Kommt drauf an[tm].
In deinem konkreten Fall würde ich die Begrenzer ^$ wohl weglassen. Aber sobald dein Suchmuster mal etwas komplexer ist als "alles was kommt" (.*), können die durchaus entscheidend sein.
Das Manual vom Apache ist leider nicht auf deutsch erhältlich im Moment.
Das ist schade. =(
Geschmackssache. Englischkenntnisse sind in der EDV ganz allgemein *sehr* empfehlenswert. Ich ziehe sogar englischsprachige Dokumentationen vor, selbst wenn es eine deutsche Fassung gibt.
Ciao,
Martin
Lieber arm dran als Arm ab.
Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(