Parameter aus URL bei mod rewrite

Tommy57

Erfahrenes Mitglied
Hallo,

ich benutze per htaccess nen modrewrite, der alle Anfragen, sofern die URL nicht existiert, an die index.php weiterleitet, was mir diverse Vorteile bietet.

Code:
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]

Bisher bin ich hingegangen und hab per
PHP:
explode('/' , substr($_SERVER['REQUEST_URI'], 1));
die URL selbst in Parameter zerlegt, so wie ich sie brauche.

Meine Frage dazu ist, ist das richtig so? Greift man so auf die Parameter aus der URL zu oder macht man das normalerweise anders?

Gruß, Tommy
 
Normalerweise macht man das über $_GET und $_POST. In ein paar Fällen wäre es sogar $_REQUEST noch denkbar. Da brauchst du allerdings nix exploden oder auseinander zu nehmen.

Mach mal ein

PHP:
var_dump($_GET);

wenn du die Parameter über URL überträgst, das gleiche mit $_POST, wenn du ein Formular mit Methode POST übermittelt hast.
 
Hallo saftmeister,

danke für die Antwort, aber das war es leider nicht. GET und REQUEST enthalten nicht die gewünschten Werte.

Meine URLs setzen sich wie folgt zusammen:

myurl.de/news/show/id/13

Der erste Parameter news sagt mir, welches Modul ich lade und show welche Funktion.
Die darauf folgenden Parameter werden in ein Array geladen, wo der erste Parameter immer dem Key entspricht und der zweite Parameter dem Value. Also hier:
$_PARAM['id'] == 13

Wie bereits gesagt, bau ich mir das selbst zusammen anhand der explode und einer for Schleife.

Ich frag mich halt nur, wie andere das machen, die die URLs auch so benutzen wie ich?!

Gruß, Tommy
 
Die benutzen mod_rewrite für das aufsplitten und hängen einfach einen Query-String an die URL an. Ein Query-String könnte nach deinem Beispiel so aussehen:

index.php?category=news&action=show&id=13

Da könntest du mod_rewrite folgendermaßen dazu bewegen (ungetestet):

Code:
RewriteRule ^([^\/]+)/([^\/]+)/([^\/]+)/([^\/]+)$ index.php?category=$1&action=$2&$3=$4 [NC,L]
 
Wenn man sich ein wenig mehr da reinkniet, dann gibt es schon elegantere Lösungen

Das Modul und die Action kann man bereits im .htaccess als solche auslesen und dem GET mitgeben. Der Rest einfach als Parameter $_GET['params']

.htaccess
Code:
#Rewrite Engine einschalten
    RewriteEngine on
#nur Pfade umleiten die keine Datei sind     
    RewriteCond %{REQUEST_FILENAME} !-f
#nur Pfade umleiten die kein Ordner sind
    RewriteCond %{REQUEST_FILENAME} !-d
#Weiterleiten	
	RewriteRule ^([^/]*)/([^/]*)/(.*)$ index.php?modul=$1&action=$2&params=$3 [NC,L]

Anschliessend lässt sich einfacherdamit arbeiten
PHP:
$modul = $_GET['modul'];
$action = $_GET['action'];

//$param initialisieren
$param = array(); 
//ggf Standartwerte setzen
$param['var1'] = 'default_value_1';
$param['var3'] = 'default_value_3';

// Aus dem String 'var1/value1/var2/value2' ein ausführbarer PHP-Code machen
// '$param['var1']='value1'; $param['var2']='value2';'
$pattern = '/([^\/]+)\/([^\/]+)\/?/';
$replace = '$param[\'$1\']=\'$2\'; ';
$phpCode = preg_replace($pattern, $replace, $_GET['params']); 

// und diesen mit eval ausführen. Die Standartwerte werden überschrieben
// falls ein Wert aus $_GET kommt.
eval($phpCode);

//TODO: Diverse Sicherheitschecks !

var_dump($modul,$action,$param);
 
Ja, super, das war das, was ich gesucht hatte. Die .htaccess setzt das zu nem Query String zusammen.

Nur mein Problem ist jetzt, dass er scheinbar immer Parameter verlangt.
Gibt es da keine Möglichkeit die angehängten Parameter optional zu lassen.

Und Yaslaw, ich verwende da eine for-Schleife, du benutzt eval, gibt es da irgendwelche Vor- und Nachteile bzw. Risiken? Könnte man da jetzt nicht irgendwie bösartigen PHP Code einschleusen, der dann in dem eval ausgeführt wird?

Wie gesagt, so ähnlich hab ich das auch.

PHP:
$standard['module'] = 'home';
$standard['controller'] = 'main';
$standard['action'] = 'index';

$urlParams = explode('/' , substr($_SERVER['REQUEST_URI'], 1));

$module = empty($urlParams[0]) ?  $standard['module'] : $urlParams[0];
$controller = empty($urlParams[1]) ? $standard['controller'] : $urlParams[1];
$action = empty($urlParams[2]) ? $standard['action'] : $urlParams[2];

for($i = 3; $i < count($urlParams); $i++) {
    if(isset($urlParams[($i + 1)])) $_PARAMS[$urlParams[$i]] = $urlParams[($i + 1)];
    else break;
    $i++;
}

var_dump($_PARAMS);

Gibt es an meiner Variante irgendetwas auszusetzen? Ich habe halt den Vorteil, das er bei mir fehlende Parameter automatisch mit den Standardwerten ergänzt, so dass die Url oft sehr kurz bleiben kann.
Kann ich das selbe Prinzip auch mit eurer Mod-Rewrite umsetzen?

Gruß, Tommy
 
Die Standartwerte hatte ich ja auch. Siehe die Komentare in meinem Code.
Aber der eval() ist durchaus ein Sicherheitsloch.
 

Neue Beiträge

Zurück