Page 1 of 1

RewritteRule frage ...

Posted: 2003-07-03 18:32
by demux
Hallo, vieleicht hat jemand einen tipp für mich.

Ich habe eine rule, die bei der eingabe von "http://www.domain.de/forum/board_bid-123_sid-17263.htm" nach dieses 'umformt' "http://www.domain.de/forum/board.php?bo ... &sid=17263"

Meine rule, die ich im moment benutz (und funktioniert!) ist diese

Code: Select all

RewriteRule ^/forum/board_bid-([0-9]+)_sid-([^/]+?).htm$    /home/forum/board.php?boardid=$1&sid=$2 [L]
Nun möchte ich das etwas vereinfachen, und habe die folgende rule ausprobiert, was aber nicht funktioniert.

Code: Select all

RewriteRule ^/forum/board_([^/]+?)-([^/]+?)_([^/]+?)-([^/]+?).htm$    /home/forum/board.php?$1=$2&$3=$4 [L]
Müsste diese RewriteRule nicht funktionieren ? Irgendwie kommt aber nicht das gewünschte ergebniss.

Hat jemand einen tipp ?

bye ...

Re: RewritteRule frage ...

Posted: 2003-07-04 00:58
by kess

Code: Select all

RewriteRule ^/forum/board_([^-]+)-([^_]+)_([^-]+)-(.+).htm$    /home/forum/board.php?$1=$2&$3=$4 [L] 
Gruß
Kess

Re: RewritteRule frage ...

Posted: 2003-07-04 20:39
by demux
Wow, danke hat mir geholfen !

Gäbe es auch eine möglichkeit automatisch mehrere variablen 'umzuwandeln', das ich mit nur einem 'rewrite' mal 3 und mal 4 variablen übergebe (array ?)

bye ...

Re: RewritteRule frage ...

Posted: 2003-07-07 23:14
by kess
Nein, mit einer einzelnen Anweisung nicht. Zwar matcht folgendes (ab Apache 2):

Code: Select all

RewriteRule ^/forum/board(?:[-_]([^-_]+))+.htm$ ... 
Gefüllt ist aber nur $1 und zwar mit dem letzten gefundenen Parameter, nicht dem ersten. $2,$3 usw. bleiben leer.

Warum übergibst du nicht einfach den gesamten Schmodder dem Script und läßt dieses auswerten? Im Endeffekt bleibst du damit flexibler.

Gruß
Kess

Re: RewritteRule frage ...

Posted: 2003-07-08 09:13
by demux
Die scripte umzuändern wäre zu aufwändig. Das ist eine forum-software wo die links als html aussehen sollen. Ich ändere einfach per templates die links, die mach klicken kann.

Eine do-while anweisung geht also nicht ? Quasi damit er die url nach variablen durchsucht wobei die anzahl unbekannt ist, und einfach alles übergibt, was er findet.

Schade, sähe schöner aus ;-)

Bye ...

Re: RewritteRule frage ...

Posted: 2003-07-08 21:13
by kess
Ã?h, doch, eine Schleife ist auch mit RewriteRules möglich. Hm *grübel*, es sollte auch das konkrete Problem damit lösbar sein. Das wäre auszuprobieren. Das ist. dann aber keine einzelne Anweisung mehr sondern etwas komplexer.

Allerdings wäre eine Ã?nderung der Skripte oder auch ein kleines dazwischen geschaltetes Skript wirklich einfacher und flexibler.

Bevor ich jetzt rumprobiere noch eine Frage: Sind es immer Parameterpare aus Name und Wert? Oder kommt auch mal nur ein Parametername ohne Wertzuweisung vor? Also so etwas z.B.:

http://www.domain.de/forum/board_bid-12 ... 3_test.htm

Gibt es sonst noch mögliche Fälle?

Gruß
Kess

Re: RewritteRule frage ...

Posted: 2003-07-08 21:35
by demux
Ja, es sind immer paare, bis auf die 'sid', die auch mal leer sein kann.

Ein echter link sieht z.b. so aus:

Code: Select all

http://www.domain.de/forum/thread.php?postid=7334&sid=6d5a6df9c97499f142c7f8bc1dd765b7&#post7334
Der 'rewrite'-link sieht so aus:

Code: Select all

http://www.domain.de/forum/thread_postid-7334_sid-6d5a6df9c97499f142c7f8bc1dd765b7.htm#post7334
Oder so, wenn die sid nicht generiert wird (cookies)

Code: Select all

http://www.domain.de/forum/thread_postid-7334_sid-.htm#post7334
Es fängt immer mit "/forum/scriptname_" and, und hat dann jeweils eine variable + wert und dann am ende die "sid", die auch leer sein kann, was man aber erkennen kann, wenn am ende "-.htm" steht.

Gemacht habe ich daraus dann das:

Code: Select all

RewriteRule ^/forum/([^_]+?)_([^-]+)-([^_]+)_([^-]+)-([^_]+)_([^-]+)-([^_]+)_([^-]+)-(.+).htm$ /home/www/forum/$1.php?$2=$3&$4=$5&$6=$7&$8=$9 [L]

RewriteRule ^/forum/([^_]+?)_([^-]+)-([^_]+)_([^-]+)-([^_]+)_([^-]+)-([^_]+)_([^-]+)-.htm$     /home/www/forum/$1.php?$2=$3&$4=$5&$6=$7&$8=$9 [L]

RewriteRule ^/forum/([^_]+?)_([^-]+)-([^_]+)_([^-]+)-([^_]+)_([^-]+)-(.+).htm$                 /home/www/forum/$1.php?$2=$3&$4=$5&$6=$7 [L]

RewriteRule ^/forum/([^_]+?)_([^-]+)-([^_]+)_([^-]+)-([^_]+)_([^-]+)-.htm$                     /home/www/forum/$1.php?$2=$3&$4=$5&$6=$7 [L]

RewriteRule ^/forum/([^_]+?)_([^-]+)-([^_]+)_([^-]+)-(.+).htm$                                 /home/www/forum/$1.php?$2=$3&$4=$5 [L]

RewriteRule ^/forum/([^_]+?)_([^-]+)-([^_]+)_([^-]+)-.htm$                                     /home/www/forum/$1.php?$2=$3&$4=$5 [L]

RewriteRule ^/forum/([^_]+?)_([^-]+)-(.+).htm$                                                 /home/www/forum/$1.php?$2=$3 [L]
Also für jede 1-4 variable und die 'sid' mal voll und mal leer. Durch $1 kann ich auch jedes beliebige script benutzen, weil der den scriptnamen einfach übergibt.

Jetzt die masterfrage, wie ich die rewrite rules (da oben) als einen aufruf mache (array ?) . Im prinzip läuft es ja so, aber vieleicht hast du ja eine idee !?

bye ... demux

Re: RewritteRule frage ...

Posted: 2003-07-09 00:09
by kess
Folgendes funktioniert mit Apache 2. Die neueste Version 2.0.46 oder 2.0.47, der morgen - hm, es ist schon nach Mitternacht, ok, in ein paar Stunden - erscheint, ist empfehlenswert (im 2.0.46 wurden bei den RewriteRules einige uralte Probleme behoben)

Code: Select all

RewriteEngine On

RewriteCond %{ENV:skript} ^$
RewriteRule ^([^_]+)((?:_[^-]+-[^_]+)*(?:_[^-]+-.*)).htm$ - [E=skript:$1,E=parms:$2,E=query:]

RewriteCond %{ENV:parms} _([^-]+)-([^_]*)(.*)
RewriteRule ^ - [E=query:%{ENV:query}&%1=%2,E=parms:%3,N]

RewriteCond %{ENV:skript} .
# RewriteRule %{ENV:skript} ^(?:board|blah|blubb)$
RewriteCond %{ENV:parms} ^$
RewriteCond %{ENV:query} ^&(.+)
RewriteRule ^ %{ENV:skript}?%1 [L]
Der erste Block prüft, ob die URL überhaupt dem Schema entspricht und holt sich den Skriptnamen. Der zweite Block zerlegt die Parameterpaare. Und der dritte Block prüft noch mal, ob alles ok ist, und baut die Zieladresse zusammen.
Passt irgendetwas nicht, wird eine Datei mit dem Ursprungsnamen gesucht, und wohl nicht gefunden, was dann einen 404 ergibt.

Die auskommentierte Zeile kann anstelle der darüberliegenden verwendet werden, um nur bestimmte Skriptnamen zuzulassen.

Disclaimer:
Der Nachbau für ähnlich gelagerte Fälle ist nur nach gründlichem, lokalem Test zu empfehlen. Ein Fehler im zweiten Block kann schnell zu einer Endlosschleife führen - eine nette Methode, sich selbst den Server abzuschießen ;)

Gruß
Kess