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