power-box.de
-


Hinweise


Antwort
 
LinkBack Themen-Optionen Thema durchsuchen Bewertung: Bewertung: 1 Stimmen, 5,00 durchschnittlich.
Alt 18.05.2005, 14:07   #1
TP-Member
 
Registriert seit: May 2005
Ort: NRW
Arno Simon macht alles soweit korrekt

mod_rewrite - rekursiv?


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
Arno Simon ist offline   Mit Zitat antworten


Alt 18.05.2005, 15:20   #2
TP-Moderator
 
Benutzerbild von Stuck Mojo
 
Registriert seit: Feb 2001
Ort: Helmstedt/Wolfsburg
Stuck Mojo ist ein richtiges Arbeitstier - DANKEStuck Mojo ist ein richtiges Arbeitstier - DANKEStuck Mojo ist ein richtiges Arbeitstier - DANKEStuck Mojo ist ein richtiges Arbeitstier - DANKEStuck Mojo ist ein richtiges Arbeitstier - DANKE
Hi Arno,

ich habs mal eben ausprobiert und mir scheint das hier ein akzeptables Ergebniss:
Code:
RewriteRule ^(.*)(catart|cat|lang|lala|pupidupi)-([-a-zA-Z0-9]+)-([0-9]+)/(.*) $1$5/id$2=$4& [L]
RewriteRule ^(.*)&/(.*) $1&$2 [L]
RewriteRule ^index.html/(.*)$ /test.php?$1 [L]
RewriteRule ^index.html$ /test.php [L]
bekomme bei folgender URL folgendes als GET-Array:
Code:
http://www.domain.tld/cat-freaks-30/catart-hoschi-22/lala-jaja-123/lang-deutsch-1/pupidupi-jaja-98/index.html

Array ( 
    [idpupidupi] => 98 
    [idlang] => 1 
    [idlala] => 123 
    [idcatart] => 22 
    [idcat] => 30 
)
..vielleicht ists das schon? Du hast sehr viel geschrieben... evtl. hab ich auch was übersehn, aber für mehr ist gerad' keine Zeit

Gruss
Jan
Stuck Mojo ist offline   Mit Zitat antworten
Alt 18.05.2005, 17:11   #3
TP-Member
 
Registriert seit: May 2005
Ort: NRW
Arno Simon macht alles soweit korrekt
Hallo Jan,

die Endlosschleife ist verschwunden Dafür schon'mal meinen herzlichsten Dank an Dich....

Allerdings..... jetzt bekomme ich stattdessen
Zitat:
Zitat von Der Apache erzählt was von
Fatal error: Call to a member function on a non-object in C:\xampp\htdocs\test.php on line 2
in der test.php, bei diesem
Code:
<?php
// var_dump($_SERVER);
 echo "test<br>";
 if(is_array($_SERVER)) echo "SERVER:".$_SERVER["QUERY_STRING"]."<br>";
 if(is_array($_GET)) { echo "GET: "; var_dump($_GET); echo "<br>"; }
 phpinfo();
?>
Rufe ich dagegen die test.php direkt auf, gibts keine Probleme?!

vG

Arno
Arno Simon ist offline   Mit Zitat antworten
Alt 18.05.2005, 17:19   #4
TP-Moderator
 
Benutzerbild von Stuck Mojo
 
Registriert seit: Feb 2001
Ort: Helmstedt/Wolfsburg
Stuck Mojo ist ein richtiges Arbeitstier - DANKEStuck Mojo ist ein richtiges Arbeitstier - DANKEStuck Mojo ist ein richtiges Arbeitstier - DANKEStuck Mojo ist ein richtiges Arbeitstier - DANKEStuck Mojo ist ein richtiges Arbeitstier - DANKE
Die test.php, die da angemeckert wird, kann nicht diese test.php sein, da in dieser definitiv kein einziges Objekt benutzt, geschweige denn eine Methode dieses aufgerufen wird.

Gruss
Jan

PS: Der Fehler kommt nicht vom Apachen sondern von PHP.
Stuck Mojo ist offline   Mit Zitat antworten
Alt 18.05.2005, 17:24   #5
TP-Member
 
Registriert seit: May 2005
Ort: NRW
Arno Simon macht alles soweit korrekt
Hallo Jan,

sorry, war'n Fehlalarm!

Ich hatte Deine .htaccess-Sequenz zu arglos übernommen und nicht genau hingeschaut, welche URL letztlich durch die beiden letzten Regeln aufgerufen wird. Kurz vor Deiner Antwort waren mir dann die /s vor test.php aufgefallen.

Entfernt und läuft super!!!

Besten Dank nochmal und ein virtuelles Bierchen an Dich.

vG

Arno
Arno Simon ist offline   Mit Zitat antworten
Alt 18.05.2005, 17:26   #6
TP-Member
 
Registriert seit: May 2005
Ort: NRW
Arno Simon macht alles soweit korrekt
Hallo Jan,

mich würde jetzt nur noch interessieren, wodurch der Effekt mit dem Speicherüberlauf zustandekommt?!

Gehe ich recht in der Annahme, das mod_rewrite die Regeln "eh" nochmal durchläuft und das [N] von daher gar nicht notwendig ist, sondern besser [L] genutzt werden sollte?

vG

Arno
Arno Simon ist offline   Mit Zitat antworten
Alt 18.05.2005, 17:47   #7
TP-Moderator
 
Benutzerbild von Stuck Mojo
 
Registriert seit: Feb 2001
Ort: Helmstedt/Wolfsburg
Stuck Mojo ist ein richtiges Arbeitstier - DANKEStuck Mojo ist ein richtiges Arbeitstier - DANKEStuck Mojo ist ein richtiges Arbeitstier - DANKEStuck Mojo ist ein richtiges Arbeitstier - DANKEStuck Mojo ist ein richtiges Arbeitstier - DANKE
Tja... so sieht es irgendwie aus... Wann und wo man nun N nutzen kann, weiss ich auf anhieb auch nicht...

Gruss
Jan
Stuck Mojo ist offline   Mit Zitat antworten
Antwort

  Aktuelles Thema
  TP Hilfe Forum > Web-Editoren & Coding > Traum-Dynamik
mod_rewrite - rekursiv? mod_rewrite - rekursiv?
« script problem - passwort abfrage | Text Mail - Tabulatoren »

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:05 Uhr.

Powered by: vBulletin Version 3.7 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd. / Search Engine Friendly URLs by vBSEO 3.2.0 ©2008, Crawlability, Inc.
Traum-Projekt.com | Suchen | Archiv | Impressum | Kontakt | | | Nach oben |



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67