Seite 1 von 1

Mod_rewrite

Verfasst: 14.03.2005, 12:47
von slider
Hallo,
ich versuche per hataccess folgende Links umzuschreiben:

https://www.domain.net/datei-c-test.html
nach
https://www.domain/datei.php?c=test

leider bekomme ich da einen 500er Serverfehler.

Die htaccess sieht so aus:

RewriteEngine on
RewriteRule ^([a-z]+)-([a-z]+)-([0-9a-z_]*)-?(.*)$ $1-$4?$2=$3 NC,QSA]
RewriteRule ^([a-z]+)-?\.html$ $1.php[NC,L,QSA]

Kann da mal jemand drauf schauen und mir einen Tip geben?

Verfasst:
von

Hochwertiger Linkaufbau bei ABAKUS:
  • Google-konformer Linkaufbau
  • nachhaltiges Ranking
  • Linkbuilding Angebote zu fairen Preisen
  • internationale Backlinks
Wir bieten Beratung und Umsetzung.
Jetzt anfragen: 0511 / 300325-0

Verfasst: 14.03.2005, 14:13
von Jonas86
am besten du ladest mal eine phpinfo.php hoch. Dann siehst du, ob ModRewrite auf dem Apache überhaupt aktiviert ist.
Wenn nicht, dann weißt du an was es liegt ;)
Falls es aktiviert ist, und du Confixx nutzt, dann ist es so, das Confixx Mod-Rewrite sperrt. Dies musst du manuell eintragen.

Kannst dich per PM bei mir melden, ich sag dir dann den Befehl

Mod_rewrite

Verfasst: 14.03.2005, 14:39
von Metaman
deine Regel sieht recht kompliziert aus???

wenn aus xx.de/wert1-wert2-wert3.html nur ein
xx.de/wert1.php?wert2=wert3 werden soll sollte es doch auch einfacher gehen

RewriteEngine on
RewriteCond %{REQUEST_URI} (.*)$
RewriteRule (.*)-(.*)-(.*).html$ /$1.php?$2=$3 [L]

wenns nicht geht, einfach mal das [L] durch ein [R] ersetzen und schauen welche URL dann angezeigt wird

bin zwar nicht gerade der mod_rewrite Profi aber bei mir benutze ich genau solche Links...

Verfasst:
von
SEO Consulting bei ABAKUS Internet Marketing
Erfahrung seit 2002
  • persönliche Betreuung
  • individuelle Beratung
  • kompetente Umsetzung

Jetzt anfragen: 0511 / 300325-0.


Mod_rewrite

Verfasst: 14.03.2005, 16:18
von Caterham
Der Pattern der Rule sollte so eng wie möglich gefasst werden, die regEx .* oder .+ so oft wie möglich vermienden werden. Der Pattern der RewriteRule wird vor der Condition geprüft.

Syntaxfehler: einmal fehlt [ vor dem Flag und in der 2. Rule fehlt ein Leerzeichen zw. .php und dem Flag
RewriteEngine on
RewriteRule ^([a-z]+)-([a-z]+)-([0-9a-z_]*)\.html$ $1.php?$2=$3 [NC,QSA,L]
RewriteRule ^([a-z]+)-?\.html$ $1.php [NC,L,QSA]
Grüße
Robert

Re: Mod_rewrite

Verfasst: 14.03.2005, 16:24
von Metaman
Caterham hat geschrieben:Der Pattern der Rule sollte so eng wie möglich gefasst werden, die regEx .* oder .+ so oft wie möglich vermienden werden. Der Pattern der RewriteRule wird vor der Condition geprüft.
Grüße
Robert
wäre demnach meine Lösung besser oder ist zu zu allgemein???

Verfasst: 14.03.2005, 16:26
von slider
Syntaxfehler: einmal fehlt [ vor dem Flag und in der 2. Rule fehlt ein Leerzeichen zw. .php und dem Flag
Das war das Problem. Vielen Dank.

mod_rewrite greedy / non-greegy regEx , Optimierung

Verfasst: 14.03.2005, 18:09
von Caterham
wäre demnach meine Lösung besser oder ist zu zu allgemein???
Die ist sehr allgemein, .* heißt ja 0 bis n beliebige Zeichen. Das ist weiter gefasst, als [a-z]+ 1 bis n Zeichen zwischen a und z. .* ist zwar die einfachtste regEx, aber auch die gefährlichste. Nicht selten führt sie zu unerwünschten Ergebnissen (Endlosschleife etc.).
[a-z]+ ist dann nebenbei auch noch eine Einschrängung der zulässigen Zeichen, auch wird vorgegeben, dass mindestens ein Zeichen vorhanden ist.
Dein Script kann also nicht irgendwie mit anderen zeichen "ausgehoben" werden, die normal nicht Bestandteil des zulässigen Wertes sind (bspw. du erwartest eine numerische ID und jmd. liefert dir %sds).

Das Problem mit diesen sog. greedy RegEx ist, dass sie versuchen so viel wie möglich auf "Biegen und Brechen" zu matchen, das verlangsamt den Prozess.
Between 0 and n times, as many times as possible, giving back as needed (greedy)

Daneben gibt es noch die non-greedy Regex, .*? / .+?; hinter dem Quantifier folgt also das Fragezeichen.
Diese versuchen so wenig wie möglich zu matchen.
Between 0 and n times, as few times as possible, expanding as needed (non-greedy). Diese non-greedy RegEx werden jedoch leider erst ab Apache 2.0.5x unterstützt.

Die RewriteCondition %{REQUEST_URI} (.*)$ ergibt immer wahr; da sie keine weitere Funktion hier hat, kann sie weggelassen werden. Zuerst wird (.*)-(.*)-(.*).html$ von der RewriteRule geprüft, dann die Condition (.*)$ und dann wird die Substitution angewendet. Am Besten sollte per ^ auch noch der Beginn der Zeichenkette markiert werden, also ^(.*)-....



Auch schlecht ist wie beim PHPbb-mod

Code: Alles auswählen

RewriteCond %{REQUEST_FILENAME} /viewforum([0-9]*)-([0-9]*)-([0-9]*).html
RewriteRule (.*) /viewforum.php?f=%1&topicdays=%2&start=%3 [L]
Die RewriteCondition ist auch hier vollkommen überflüssig. Zuerst wird der Pattern der RewriteRule (linkter Teil) geprüft (.*), dieser ist für alles wahr (Bilder, die PHP-Dateien etc. - alles) und dann erst die Condition, die hier die Einschränkung auf bestimmte requests vornimmt. Auch zählt der Punkt '.' als ein beliebiges Zeichen, er sollte also escaped werden(\.html), damit der Punkt als Punkt gewertet wird ('literal period').

Dabei hätte an der Rule schon nach einem processing-Schritt an der Regel abgebrochen werden können:
RewriteRule ^viewforum([0-9]+)-([0-9]+)-([0-9]+)\.html$ /viewforum.php?f=$1&topicdays=$2&start=$3 [L]
daneben ist das L-Flag auch immer wichtig, oft wird es leider weggelassen. Dann werden darunterliegende Regeln im ersten Durchlauf der .htaccess nicht mehr (um sonst) geprüft. Im 2. Durchlauf werden dann alle Regeln noch einmal durchlaufen (bzw. der Pattern geprüft). Auch deshalb den Pattern der RewriteRule immer so eng wie möglich definieren, damit möglichst wenig Schritte nötig sind, um festzustellen, dass die Substitution der Rule nicht ausgeführt werden soll.

grüße
Robert