Hallo Leute,
ich habe meine Anfrage
bereits gestern auf modrewrite.de einmal gepostet, aber komme - trotzdem ich Tonnenweise Tutorials und Beiträge gelsen habe - nicht wirklich weiter.
Daher möchte ich hier einmal einen neuen Versuch machen um die ganze Sache vielleicht etwas besser zu beschreiben. Der Link oben dient mehr der Historisierung sowie ggf. Eurer Information was bereits gelaufen ist und der verlinkte Beitrag wird von mir auch noch um einen Link auf diesen hier ergänzt.
Zur Sache:
Ich arbeite mit (nicht an) einem CMS, welches natürlich URL ala
http://www.meinedomain.de/cms/test/s...at=30&idlang=1
abgibt, was natürlich nicht gerade sehr Spiderfreundlich ist und damit die Chancen für meine in Vorbereitung befindliche Site, in Suchmaschinen ordentlich gelistet zu werden, schmälert.
Daher gedenke ich die Url wie folgt umzuschreiben:
http://www.meinedomain.de/cms/test/c...h-1/index.html
wobei ab .../test/ jeder der 3 Ordner für einen der Parameter stehen soll.
In diesem Ordnerbezeichner ist ein Part des Parameternamens (ohne führendes ID; z.B. cat statt idcat), eine Klartextübersetzung der Parameterid (z.B. hoschi) sowie die ParameterID (z.B. 22) an sich enthalten.
Dieses Konstrukt soll nun über folgende .htaccess-RewriteRule umgesetzt werden:
Code:
RewriteEngine on
#RewriteLog logs/rewrite.log
#RewriteLogLevel 9
RewriteBase /cvs_cms/test/
# s-1es------2--------e s-----3-------e s-4----e s-5e
RewriteRule ^(.*)(catart|cat|lang)-([-a-zA-Z0-9]+)-([0-9]+)/(.*) $1$5/id$2=$4& [N]
RewriteRule ^index.html/(.*)$ test.php?$2 [L]
RewriteRule ^index.html$ test.php [L]
Leider verfällt mein Appache sobald ich mehr als einen (Parameter)-Unterordner (z.B. die oben gepostete Beispiel-Url) aufrufe in eine Endlosschleife, was mir ziemlich schnell auch einen Windowsabsturz beschehrt. Mangelnder Virtueller speicher und fehlerhafte Speicherzugriffe führen zu einem Totalabsturz des Apachen (XAMPP1.2).
Teste ich die RegEx mit folgendem Script, habe ich keine bis mäßige Probleme. Ein paar störende /-Zeichen, wie in oben verlinktem Thread geschildert, sind gegen das Kernproblem vermutlich ein Klacks....
Code:
<?php
echo $_SERVER["REQUEST_URI"]."<br>";
// s-1es----2--------------es--4----------e s5-----e s6-e
// s--------3------e
// $srch = '^(.*)((catart|lang|cat)-)+([-a-zA-Z0-9]+)-([0-9]+)/(.*)^';
// $trg2 = '$1$6/id$2=$5&';
// s-1es----2----------e s--3----------e s4-----e s5-e
$srch = '^(.*)(catart|lang|cat)-([a-zA-Z0-9]+)-([0-9]+)/(.*)^';
$trg2 = '$1$5/id$2=$4&';
$fnd = '^(catart|lang|cat)-^';
$trg = '1: $1<br>2: $2<br>3: $3<br>4: $4<br>5: $5<br>';
if(isset($_GET["test"])) {
$test = $_GET["test"];
} else {
$test = '/catart-test-55/cat-home-4/lang-deutsch-1/index.html';
}
preg_match($fnd, $test, $results);
while(is_array($results) && (!count($results)==0))
{
$res = '';
$res = preg_replace( $srch, $trg, $test );
echo $res."<br>";
$res = '';
$res = preg_replace( $srch, $trg2, $test );
echo $res."<br>";
$test = $res;
preg_match($fnd, $test, $results);
}
$srch = '^index.html/(.*)^';
$res = '';
$res = preg_replace( $srch, $trg, $test );
echo $res."<br>";
$res = '';
// $trg2 = 'front_content.php?$1';
$res = preg_replace( $srch, $trg2, $test );
echo $res."<br>";
?>
Analysiere ich den String
/catart-hoschi-44/cat-freaks-22/lang-deutsch-1/index.html
mit dieser Regel (die Zeile über dem RegEx dient nur der Übersichtlichkeit - insbesondere um die Parameterstellen besser zu erkennen)
Code:
s-1es---------2-----e s------3-----e s-4----e s-5e
^(.*)(catart|lang|cat)-([a-zA-Z0-9]+)-([0-9]+)/(.*)
erhalte ich - mit meinem Script wohlgemerkt, vom Apachen erhalte ich dort ja leider keine Ausgabe ... - im ersten Schritt
1: /catart-hoschi-44/cat-freaks-22/
2: lang
3: deutsch
4: 1
5: index.html
Durch den Ersetzungspart
$1$5/id$2=$4&
wird daraus
/catart-hoschi-44/cat-freaks-22/index.html/idlang=1&
Dieser String wird durch [N] ja auch in der RewriteRule nochmal geprüft - bei mir halt durch die Schleife. Die Ergebnisse der Schritte 2 und 3 sehen dann so aus:
S2:
1: /catart-hoschi-44/
2: cat
3: freaks
4: 22
5: index.html/idlang=1&
/catart-hoschi-44/index.html/idlang=1&/idcat=22&
S3:
1: /
2: catart
3: hoschi
4: 44
5: index.html/idlang=1&/idcat=22&
/index.html/idlang=1&/idcat=22&/idcatart=44&
Dummerweise wird die Schleife bei mir ein viertes mal durchgeführt, wodurch hinten noch ein 'id=&' zusätzlich angehangen wird. Das ist aber im Moment nicht das Kernproblem, sondern woher die Endlosschleife im Apachen kommt....
Das der Part (catart|cat|lang) des Ausdrucks auch immer auf den neuen Ausdruck zutrifft, ist mir bewußt. Durch den folgenden "-" wird es allerdings (bei mir im Script bzw. in PHP) vermieden, das er den Ausdruck zu oft prüft. Das mod_rewrite nicht gleich PHP ist, weiß ich

Kommt der Fehler durch unterschiedliche Arbeitsweisen der Regex-Parser von PHP und MOD_REWRITE zustande oder wie muß ich mir das ganze erklären?
Ich möchte jetzt doch mal die Experten unter Euch an die Front bitten, daß die mir erklären, warum das ganze so nicht funktionieren kann.
Evtl. währe ein Vorschlag wie man das ganze lösen kann für mich auch hilfreich. Getreu dem Motto "so wenig Arbeit wie möglich" spiele ich derzeit mit dem Gedanken alle .html-Aufrufe über mein Zusatzscript laufen zu lassen und per Header an das eigentliche CMS weiterzuleiten, bezweifle aber, daß diese Vorgehensweise den Spidern sonderlich gefallen dürfte....
vG
Arno