phpbar.de logo

Mailinglisten-Archive

[php] mod_rewrite

[php] mod_rewrite

Jens Giessmann jg at handcode.de
Die Mai 8 10:59:18 CEST 2007


Hi,

On Tue, May 08, 2007 at 10:00:59AM +0200, LB BL wrote:
> danke für deine antworten.
> 
> also habe ich richtig verstanden, dass ja deiner meinung nach auch
> auf jeden fall ein script notwendig ist, welches die requests durch
> aufruf eines entspr. php-scripts (hier: prod_parser.php) von
> apache-mod-rewrite überprüft.

Jein, du kannst es wie in deiner 1. Mail beschrieben ueber eine
RewriteMap machen. Dann brauchst du kein Script. musst aber
"irgendwie" die Map pflegen.

Meine Vorschlaege basieren darauf, dass Mapping zwischen

www.domain.de/products/produktAbkuerzungAusDB/produktNameAusDB.html
und 
www.domain.de/index.php?id=1234

nicht in den Rewrites sondern in einem PHP-Script zu machen.

> dabei verwendest du jedoch nicht die rewriteMap Direktive, sondern
> leitest auf ein php script? aber wie soll das funzen ohne dass das
> so aufgerufene php-script einen neuen http-request sendet um auf die
> richtige seite weiterzuleiten und damit die echte url sichtbar im
> browser wird?  oder hab ich was falsch interpretiert...

Der Apache mit der RewriteRule ist hier ein Proxy. D.h. du machst
keine Umleitung, sondern der Apache/Proxy leitet die Anfrage
transparent an das PHP-Script. Dieses sucht anhand der URL den
passenden Inhalt und liefert den aus, bzw. zeigt eine Fehlerseite an.

Der Client bekommt davon ueberhaupt nichts mit, es sei denn er hat
eine URL aufgerufen die dein PHP-Script nicht zuordnen kann und es
wird ein 404 gesendet.

Stark vereinfachte/schematische Funktion in prod_parser.php
--------------------------------schnipp-----------------------------

// Angefragte URL auseinander nehmen
$URL_PARTS = explode('/', $_SERVER['SCRIPT_NAME']); 
 
// ergibt z.B. 
// Array 
// ( 
//     [0] =>  
//     [1] => products 
//     [2] => produktAbkuerzungAusDB 
//     [3] => produktNameAusDB.html 
//     ) 
 
$prod_kuerzel = $URL_PARTS[2]; 
$prod_name    = basename($URL_PARTS[3], '.html');  

// Gibt es was passendes in der DB?
if (DB_SELECT_WHERE prod_kuerzel= $prod_kuerzel AND prod_name = $prod_name) { 
   
  // Zeige das Produkt an 
 
 } 
 else { 
   // Produkt gibt es nicht, Leite z.B. auf 404 um oder gib eine 
   // Fehlerseite aus. 
 } 
--------------------------------schnapp-----------------------------

Natuerlich alles mit sauberer Eingabe-Pruefung, escaping usw.

Gruss Jens

php::bar PHP Wiki   -   Listenarchive