mod_rewrite problem

MakD42
Beiträge: 103
Registriert: Sa 8. Nov 2003, 19:01
Wohnort: Marburg
Kontaktdaten:

from MakD42 & Godspeed

Beitrag von MakD42 »

Wir posten den gesamten Vorgang für Suchmaschinenfreundliche URL via mod_rewrite & .htaccess für Navigation, Hilfsnavi und News sobald ein wenig Zeit ist - hier im Forum. Natürlich inkl. index.php für noch besseren Suchergebnisse.

Ergebnis zu sehen unter: http://www.setup-scout.de

Gruß MakD42 & Godspeed
MakD 42
______________________
Contenido 4.6.8 & 4.8.15
MySQL 5.1.54
Linux/Apache
Meine Contenidoprojekte: art & weise | StadtMedia | aidea
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence »

machst du die zuweisung neuer url namen innerhalb von modulen oder onthefly ?
Godspeed
Beiträge: 49
Registriert: Mi 3. Sep 2003, 13:25
Kontaktdaten:

Beitrag von Godspeed »

ich mach das in den einzelnen Modulen und hab es hinbekommen das nun nicht mehr steht z.B. artikel42.html sondern Impressum.html oder ähnliches.
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence »

und genau das wollte ich nicht machen ;-) ich wollte innerhalb von contenido bei diesem fall nichts angreifen...
ich geh den anderen weg... (da brauch ich keinerlei module mehr ändern)
wenns unterstützt wird, wirds verwendet, wenn nicht, normale anzeige wie bisher...
bei mir ist die url syntax zwar nicht so schön, dafür ist es aber egal wieviele variablen und werte da zusammenkommen (reihenfolge ist ebenso egal)
Godspeed
Beiträge: 49
Registriert: Mi 3. Sep 2003, 13:25
Kontaktdaten:

Beitrag von Godspeed »

klingt Interessant. Wie machst du das? Hast du eine Seite wo ich mir das mal ansehen kann?
Für mich war das der einfachste Weg :) und eigentlich kommt es mir auch nur darauf an das die Seiten wieder bei Google gefunden werden
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence »

laufen tut meine routine momentan mit php4.1.0 für php4.0.6 muss ich noch ne menge ändern...
im prinzip leitet meine .htaccess alle anfragen auf mein file um...
nimmt den url string auseinander den $_SERVER['REQUEST_URI'] liefert...
und transformiert dies anschließend in eine normale url die das script versteht.
diese transformierte url wird anschließend in eine variable geladen und dann werden sämtliche urls, die dort angefunden werden, auf ein format formatiert die von der .htaccess wieder auf die index.php umgeleitet werden können.
erst dann erfolgt die ausgabe des umgeformten quelltextes...

zusätzlich werden ebenfalls alle anfragen die via post gesendet werden in einen location string umgewandelt und mitübergeben...
ebenso werden mit angegebene location strings ebenfalls übergeben...
leere zuweisungen wie &a=&b=&c= werden entfernt...
bei der ersetzung wird ebenso darauf geachtet anchors zu berücksichtigen...

der vorteil diese methode ist für mich wie gesagt das ich nichts an bestehenden modulen ändern muss... und das ich es ansich für jedes andere content managment system verwenden kann...

momentan werden nur ersetzungen bei <a href= vorgenommen
form posts, gets sind noch nicht bei den ersetzungen berücksichtigt...
img src ersetzungen sind bei dieser variante nicht notwendig...
und ich brauche keine weiteren änderungen an der .htaccess vornehmen...
javascript window.open konstrukte werden nicht ersetzt...

eine transformation von urls wie
http://localhost/directory/request/id/1/page/1/
ist in diesem frühen stadium der routine nicht berücksichtigt
(da würden img ersetzungen noch dazukommen)

short urls (wie 2-3-4-5-content.php) sind theoretisch zwar möglich nur verwende ich noch nicht...

eine erste version läuft momentan unter {zensur}
auf php 4.1.0 -> bitte mit vorsicht geniessen da die seite noch lange nicht fertig ist... und jede menge inhalte fehlen...
Zuletzt geändert von emergence am Fr 21. Nov 2003, 15:08, insgesamt 1-mal geändert.
Godspeed
Beiträge: 49
Registriert: Mi 3. Sep 2003, 13:25
Kontaktdaten:

Beitrag von Godspeed »

Hab an den Modulen auch nur das <a href= geändert, bis jetzt :) .
Deine Methode klingt fast wie meine, nur das ich meine .php datei (wo meine url's wieder in Contenido vertendliche Form gebracht wird) in die front_content.php includet.
Ich hab nur das Problem das ich keine Umlaute verwenden darf und keine & Zeichen.
timo
Beiträge: 6284
Registriert: Do 15. Mai 2003, 18:32
Wohnort: Da findet ihr mich nie!
Kontaktdaten:

Beitrag von timo »

emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence »

@timo

theoretisch geht das auch...
nur muss die requested uri anders behandelt werden...
da die nötigen information zb von $parsed = parse_url($_SERVER['REQUEST_URI']);
innerhalb von $parsed[path] ausgewertet werden müsste...
zusätzlich müsste noch img und form diesbezüglich modifiziert werden...
und die onthefly url ersetzung dementsprechend angepasst werden...
da sehe ich aber noch kein problem...
bei einer url wie
http://foobar/index.php/idcat/9/idart/15

problematisch für mich wäre (rate mal) die rewriterule diesbezüglich anzupassen! da stellts mich sicher wieder länge mal breite auf...

bei übergabe eines querystrings muss ich mir erst ansehen wie die zurückgelieferten werte aussehen...

dies war auch der grund warum ich die routine vorerst mal so konzipiert habe... alles weitere ist für mich eine ausbaustufe der grund routine -> aber da hab ich momentan noch ein paar andere probleme...

1. die anpassungen für php 4.0.6 vorzunehmen
2. die form post ersetzungen einzubauen
3. eventuell mittels db tabelle realnames anzuzeigen und urls im stil von impressum.html zu generieren... (nur müsste dann der titel eines dokuments einzigartig sein...)
für punkt 3 würde einfach nur dann eine umleitung von allen *.html anfragen auf die index.php vornehmen... die requestet uri in der db einfach abfragen und den entsprechend zurückgelieferten wert dann für die anforderung neu generieren...
und beim onthefly replacement -> werden die ersetzungen in der db eingetragen wenn der wert nicht vorhanden ist...
4. wenn ich das so durchziehe weiss ich noch nicht wie schnell oder langsam dieser spass eigentlich ist (momentan braucht eine auswertung und komplette ersetzung ca 0.014 sekunden) -> blöd wirds nur wenn das auf sagen wir mal 0.5 sekunden oder mehr ansteigt...

ich machs mal so: immer einen schritt nach dem anderen...
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence »

Godspeed hat geschrieben:Ich hab nur das Problem das ich keine Umlaute verwenden darf und keine & Zeichen.
ich bin zwar noch nicht so weit mit meinen tests. wie sieht dein problem den genau aus ?
& und umlaute werden bei dir wie verwendet ?
Godspeed
Beiträge: 49
Registriert: Mi 3. Sep 2003, 13:25
Kontaktdaten:

Beitrag von Godspeed »

er wandelt bei meinem Skript z.B. das ü in ue soweit bin ich schon nur dann findet er die Seite nicht mehr. hatte mir Überlegt das ich beim Unschreiben der Umlaute sowas wie ein ! einfüge damit ich das wieder zurück schreiben kann.
Und das & habe ich bei mir als Link : Art & Weise.
mal schaun was der Tag heute Bringt :D
Godspeed
Beiträge: 49
Registriert: Mi 3. Sep 2003, 13:25
Kontaktdaten:

Beitrag von Godspeed »

Wie kann man eigentlich schaun wie lange eine Seite braucht zum laden?
Hab bei mir keine Änderung feststellen können.
Bin soweit fertig mit meinen Änderungen und es funzt auch alles. Sag mir mal was du davon hälst.
Änderung in der Hauptnavigation:
die Zeile

Code: Alles auswählen

$tpl->set('d', 'HREF',  $sess->url('front_content.php?idcat='.$data['idcat']));
hab ich überall ersetzt durch

Code: Alles auswählen

$seite = "";
     for($i=0;$i<=strlen($data['name']);$i++){
        $text = substr($data['name'], $i, 1);
  	switch($text){
  		case ü : { $seite .= "ue"; break;}
  		case Ü : { $seite .= "Ue"; break;}
  		case ä : { $seite .= "ae"; break;}
  		case Ä : { $seite .= "Ae"; break;}
  		case ö : { $seite .= "oe"; break;}
  		case Ö : { $seite .= "Oe"; break;}
  		default :  { $seite .= $text;}
  	}
  }
$tpl->set('d', 'HREF',  $sess->url('aw'.$seite.'.html'));
muss leider so lang sein damit das mit den Umlauten funzt

dann die .htaccess :

Code: Alles auswählen

Options +FollowSymlinks 
RewriteEngine On
RewriteRule /aw(.*)\.html$ /front_content.php?name=$1
Und meine name.php datei die ich in der front_content.php includet und dann in das cms verzeichnis kopiert habe :

Code: Alles auswählen

<?php
  for($i=0;$i<=strlen($name);$i++){
    $text = substr($name, $i, 1);
    switch($text){
  	  case u : {if(substr($name, $i+1, 1)=="e"){ $seite .= "ü"; $i = $i+1;}
		        else $seite .= $text;
		        break;}
      case U : {if(substr($name, $i+1, 1)=="e"){ $seite .= "Ü"; $i = $i+1;}
	            else $seite .= $text;
		        break;}
  	  case a : {if(substr($name, $i+1, 1)=="e"){ $seite .= "ä"; $i = $i+1;}
				else $seite .= $text;
		        break;}
      case A : {if(substr($name, $i+1, 1)=="e"){ $seite .= "Ä"; $i = $i+1;}
	  			else $seite .= $text;
		        break;}
  	  case o : {if(substr($name, $i+1, 1)=="e"){ $seite .= "ö"; $i = $i+1;}
				else $seite .= $text;
		        break;}
      case O : {if(substr($name, $i+1, 1)=="e"){ $seite .= "Ö"; $i = $i+1;}
	  			else $seite .= $text;
		        break;}
      default :  { $seite .= $text;}
    }
  }
 if($seite){
   $sql = 'SELECT idcat FROM '.$cfg["tab"]["cat_lang"].' WHERE name="'.$seite.'"';
   $db = new DB_Contenido;
   $db->query($sql);
   $db->next_record();
   $idcat = $db->f("idcat");
  }
?>
gruß Alex
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence »

Godspeed hat geschrieben:Wie kann man eigentlich schaun wie lange eine Seite braucht zum laden?
für selbstgeschriebene php files verwende ich am beginn der datei einfach:

Code: Alles auswählen

$t_start = doubleval(ereg_replace('^0\.([0-9]*) ([0-9]*)$','\\2.\\1',microtime()));
und am ende (bis zu den teil den ich testen möchte zB:

Code: Alles auswählen

$t_end = doubleval(ereg_replace('^0\.([0-9]*) ([0-9]*)$','\\2.\\1',microtime()));
echo "Generated in ".($t_end-$t_start)." seconds.\n";
Godspeed hat geschrieben:Sag mir mal was du davon hälst.
ähm, ich würde an deiner stelle bei den variablen eindeutigere namen verwenden, wo die gefahr nicht besteht, das sie von einem anderen modul eventuell geändert oder überschrieben werden... die lesbarkeit erhöht sich ungemein. ($i, $seite etc... sind nicht ideal) abgesehen würde dein code so ziemlich mit jeder php version funktionieren ;-)

die ersetzung von umlauten würde ich anders lösen (ich würd komplett drauf verzichten, ein problem mit leerzeichen wirst du auch haben) sieh dir die funktion urlencode(oder ähnliche funktionen) an. -> http://at.php.net/manual/en/function.urlencode.php
Godspeed hat geschrieben: dann die .htaccess :

Code: Alles auswählen

Options +FollowSymlinks[/quote]
versuch mal diese zeile zu streichen, obs bei dir dann noch läuft -> einige provider werfen eine fehlermeldung raus, wenn diese zeile drinnen ist, bei mir gehts ohne...

zum testen hab ich momentan leider keine zeit, aber ich sehs mir an...
Godspeed
Beiträge: 49
Registriert: Mi 3. Sep 2003, 13:25
Kontaktdaten:

Beitrag von Godspeed »

Guter Einwand mit den Variablen, bin das mit dem i leider so von C gewöhnt :roll: .
Mit Leerzeichen hab ich keine Probleme und es geht auch ohne Options +FollowSymlinks.
Das mit den Umlauten ist da schon eher ein Problem, weil ich dabei bin eine schon recht große Seite umzuschreiben. Da es sich bei der Seite um Gründer informationen handelt kommen auch sehr viele Umlaute vor und es sieht seltsam aus, wenn ich ich die so ersetze.
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence »

also jetzt hab ich mal die anpassungen für 4.0.6 alle drinnen und funkt auch. nur bin ich jetzt auf ein neues problem gefunden welches ich noch nicht beachtet hatte.

@timo
irgendeine ahnung wie ich die $_SESSION auslesen und weitergeben kann ?? das mit pass through schluckt alles bis diese variable...

auf gut deutsch bei jedem klick auf einen link wird eine neue Sessionvariable gesetzt(sehe ich in der db)...
Gesperrt