Erklärungen zum Syntax des Redirects über htaccess

Alles, was den Apache betrifft, kann hier besprochen werden.

Erklärungen zum Syntax des Redirects über htaccess

Postby magic » 31. July 2007 11:00

Hallo,

würde mich über eine Erklärung des Syntax freuen...

Es geht sich um:
Code: Select all
RewriteEngine on
RewriteCond %{HTTP_HOST} !^www\.alte-domain\.de$
RewriteRule ^(.*)$ http://www.neue-domain.de/$1 [L,R=301]

Damit ich das endlich mal verstehe, habe ich mich versucht, damit zu beschäftigen, finde aber nicht alle Erklärungen.

Der Syntax ! bedeutet doch eine Art Verneinung der Bedeutung des nachfolgenden Syntax. Ich verstehe nicht, wozu dieser gesetzt wird.

Mit (.*) wird doch eine Zeichenkette ausgelesen und in $1 gespeichert. $1 taucht dann am Ende wieder auf. Was wird denn ausgelesen und wozu wird es am Ende eingefügt?

---

Eine weniger selektive Regel, die ich zum gleichen Thema fand, beginnt mit:
Code: Select all
Options +FollowSymlinks

und nutzt:
Code: Select all
RewriteCond %{HTTP_HOST} ^alte-domain.de [nc]


Was bedeutet Options +FollowSymlinks?

Mit ^ wird der Anfang einer URL definiert. Benötigt man keinen Platzhalter, um auch die Subdomains zu berücksichtigen, z. B. beispiel.alte-domain.de?

Der Ersteller lässt hier $ weg und markiert somit nicht das Ende der URL. Muss das Ende gar nicht zwingend markiert werden?

---

Sorry, ich kenne mich nicht wirklich mit Apache mod_rewrite aus, will es aber endlich verstehen lernen.

Danke für die Hilfe!
magic
 
Posts: 6
Joined: 31. July 2007 10:23

Postby KingCrunch » 31. July 2007 13:11

Der Syntax ! bedeutet doch eine Art Verneinung der Bedeutung des nachfolgenden Syntax. Ich verstehe nicht, wozu dieser gesetzt wird.
Es ist nicht nur "eine Art Verneinung" ;) Sprachlich kannst du es als "nicht" übersetzen. Im konkreten Beispiel: "Wenn HTTP_HOST nicht www.alte-domain.de". Wozu das gut ist, liegt am Verwendungszweck.
Mit (.*) wird doch eine Zeichenkette ausgelesen und in $1 gespeichert. $1 taucht dann am Ende wieder auf. Was wird denn ausgelesen und wozu wird es am Ende eingefügt?
"Ausgelesen" und "Gespeichert" wird da garnix.
Naja, vorne anfangen: Eine RegEx vergleicht immer auf Strings. Der konkrete Ausdruck (.*) sagt nun, dass beliebig oft (der Stern, heißt auch Null mal) auf ein beliebiges Zeichen (der Punkt) matcht ("übereinstimmt" wenn man so will ^^). Die Klammern setzen eine Back-Reference, also einen Rückbezug. Das heißt, dass $1 sich auf diese Klammer bezieht. In dem Sinne ist es nicht direkt "Speichern", auch wenn man es vielleicht so betrachten kann ;).
Wozu es am Ende eingefügt wird, kann dir wohl auch nur der Urheber der Rule sagen ;)
Was bedeutet Options +FollowSymlinks?
RTFM
Mit ^ wird der Anfang einer URL definiert. Benötigt man keinen Platzhalter, um auch die Subdomains zu berücksichtigen, z. B. beispiel.alte-domain.de?
Also, erstmal jein, das ^ bezeichnet, dass der Ausdruck ausgehend vom Anfang auf den Vergleichsstring passen soll.

Für den Rest brauch ich erstmal nen Kaffee ^^ Es gibt übrigens gute RegEx-Seiten. Die beziehen sich zwar allgemein auf reguläre Ausdrücke, aber was anderes is das hier ja auch net ;)
Nicht jeder Fehler ist ein Bug ...
KingCrunch
 
Posts: 1724
Joined: 26. November 2005 19:25

Postby magic » 31. July 2007 14:22

KingCrunch, ich danke Dir! Dennoch ein schwerer Brocken für mich, da ich das alles noch nicht wirklich verstehe und viel Kaffee dabei auch nicht hilft... Genieße aber Deinen Kaffee!

Nun ja.

Ich habe schon versucht, die ein oder andere RegEx-Seite zu lesen. Dazu sollte man vorher wohl besser eine Ausbildung/ein Studium zum Programmierer machen...

Also kann man das ! im konkreten Beispiel weglassen, da es ja gar keine Regel dazu gibt, wenn HTTP_HOST nicht "www.alte-domain.de" ist?

TFM habe ich geR, aber leider dort zu Options +FollowSymlinks dieses gefunden:
Symbolische Links innerhalb des Verzeichnisses werden aufgelöst.
Sorry, dass ich meine Frage nicht korrekt formuliert habe. Was bedeutet das?

Die Frage nach Deinem Kaffee:
Der Ersteller lässt hier $ weg und markiert somit nicht das Ende der URL. Muss das Ende gar nicht zwingend markiert werden?

Nochmals vielen Dank! :D
magic
 
Posts: 6
Joined: 31. July 2007 10:23

Postby KingCrunch » 31. July 2007 16:08

Also kann man das ! im konkreten Beispiel weglassen, da es ja gar keine Regel dazu gibt, wenn HTTP_HOST nicht "www.alte-domain.de" ist?
Weiß zwar net, wie du darauf kommst, aber nein ^^ Im konkreten Fall versucht er die nächste Regel anzuwenden, wenn der Host nicht passt. Lässt man das ! weg, versucht er die Regel anzuwenden, wenn der Host passt. Das wäre dann genau der Gegenteilige Effekt ;)
TFM habe ich geR, aber leider dort zu Options +FollowSymlinks dieses gefunden:
Symbolische Links innerhalb des Verzeichnisses werden aufgelöst.
Sorry, dass ich meine Frage nicht korrekt formuliert habe. Was bedeutet das?
Unter Linux (und ziemlich vergraben auch unter Windows) gibt es eben solche symbolische Links. Dabei zeigt ein Verzeichnis auf den Inhalt eines andere Verzeichnis. Für den Benutzer sieht es so aus, als seien beide Verzeichnisse identisch und Änderungen im Einen wirken sich auch direkt auf das andere aus (sie sind gewissermaßen "symbolisch verknüpft" ;)). Die Option sagt nun, dass symbolische Verknüpfungen aufgelöst werden sollen.

BeitragVerfasst am: 31. Juli 2007 15:22 Titel:
KingCrunch, ich danke Dir! Dennoch ein schwerer Brocken für mich, da ich das alles noch nicht wirklich verstehe und viel Kaffee dabei auch nicht hilft... Genieße aber Deinen Kaffee!

Nun ja.

Ich habe schon versucht, die ein oder andere RegEx-Seite zu lesen. Dazu sollte man vorher wohl besser eine Ausbildung/ein Studium zum Programmierer machen...

Also kann man das ! im konkreten Beispiel weglassen, da es ja gar keine Regel dazu gibt, wenn HTTP_HOST nicht "www.alte-domain.de" ist?

TFM habe ich geR, aber leider dort zu Options +FollowSymlinks dieses gefunden:
Symbolische Links innerhalb des Verzeichnisses werden aufgelöst.
Sorry, dass ich meine Frage nicht korrekt formuliert habe. Was bedeutet das?

Die Frage nach Deinem Kaffee:
Der Ersteller lässt hier $ weg und markiert somit nicht das Ende der URL. Muss das Ende gar nicht zwingend markiert werden?
Jein. Es gibt zwei Arten, wie Suchmuster übereinstimmen können: "Lazy" ("faul") und "Greedy" ("gierig"). Im ersten Fall reicht es, wenn die minimale Übereinstimmung gefunden wird, dann bricht er ab. Im zweiten Fall versucht er, auch wenn das Vergleichswort bereits dem Muster übereinstimmt, eine möglichst große Übereinstimmung zu finden:
Code: Select all
RegEx: .+
Vergleichswort: abc
Lazy:  Matcht auf "a" (reicht ihm)
Greedy: Matcht auf "abc" (weil er möglichst viel will)
Welchen Algorithmus mod_rewrite jetzt verwenden, ist mir nicht ganz klar, glaube aber, es war "Lazy". Mit $ geht man einfach auf Nummer sicher, weil er dann das Zeilenende mit sucht und das natürlich am Ende steht ;)
Nicht jeder Fehler ist ein Bug ...
KingCrunch
 
Posts: 1724
Joined: 26. November 2005 19:25

Postby magic » 01. August 2007 11:28

Da fällt mir jetzt gerade nichts mehr zu ein! :D

Vielen, vielen Dank für die ganze Zeit und Mühe!
magic
 
Posts: 6
Joined: 31. July 2007 10:23

Postby magic » 01. August 2007 13:54

Und ich habe wieder nachgedacht...

In welchen Fällen sollten denn symbolische Links mit Options +FollowSymLinks aufgelöst werden? (in Bezug auf oben) Immer?

Leitet denn jetzt:
Code: Select all
Options +FollowSymLinks
RewriteEngine on
RewriteRule (.*) http://www.newdomain.com/$1 [L,R=301,nc]

alles um? Also:
http://domain.de
http://www.domain.de
http://beispiel.domain.de

Und:
Code: Select all
^alte-domain.de$
leitet dann nicht http://beispiel.domain.de um?

(Ich glaube, dass ist doch nichts für mich... :? aber das will ich wenigstens noch abschließend ein wenig verstehen.) :wink:
magic
 
Posts: 6
Joined: 31. July 2007 10:23

Postby KingCrunch » 01. August 2007 17:13

Code: Select all
^alte-domain.de$
Tut selber garnix, weils bloss nen Ausdruck ist.

Erste Frage: Probier doch ma aus ;) (access.log). Eigentlich dürfte der nur auf die Startseite von neue-domain.de umleiten, ohne irgendwas anzuhängen, weil (.*) eigentlich schon abbrechen sollte, wenn er nichts gesucht hat ^^ Da steht ja nur "beliebige Zeichen beliebig oft (auch Null mal)". Mit dem "Null mal" sollte er sich ja scho zufrieden geben. Insofern lieber die Anker ^$ drumer herum setzen.
Nicht jeder Fehler ist ein Bug ...
KingCrunch
 
Posts: 1724
Joined: 26. November 2005 19:25

Postby magic » 02. August 2007 08:23

Meinst Du mit Anker:
Code: Select all
RewriteRule ^(.*)$ http://www.neue-domain.de/$1 [L,R=301]
?

Ich habe im Firmennetzwerk leider keinen Zugriff auf access.log.

Kannst Du mir bitte noch abschließend diese letzte Frage beantworten?

In welchen Fällen sollten denn symbolische Links mit Options +FollowSymLinks aufgelöst werden? Immer?

Danke für alles! Dann ist auch Schluß. :wink:
magic
 
Posts: 6
Joined: 31. July 2007 10:23

Postby KingCrunch » 02. August 2007 10:48

Jo, die Anker, sind die Dinger, die den Suchausdruck an bestimmten Stellen (am Anfang ^ und am Ende $) "verankern". Nochma bissel Beispiele:
Code: Select all
a    <--- Der reguläre Ausdruck passt auf
a
abbb
aaaaa
bbbbaaa

^a    passt auf
a
aaaaa
abbbb
bbbaaaa  <--- darauf nicht

a$  passt auf
a
bbba
aaaa
aaaabbbb  <--- darauf nicht

^a$ passt nur auf
a



Ehrlich gesagt: kA, wann man die Option jetzt genau braucht :D Ich würde sie aus lassen, solange man keine symbolischen Links benutzt, was unter Windows zB sehr selten sein dürfte.
Nicht jeder Fehler ist ein Bug ...
KingCrunch
 
Posts: 1724
Joined: 26. November 2005 19:25


Return to Apache

Who is online

Users browsing this forum: No registered users and 24 guests