tutorials.de Buch-Aktion 05/2012
Like Tree4Danke
  • 1 Beitrag von saftmeister
  • 1 Beitrag von Yaslaw
  • 1 Beitrag von saftmeister
  • 1 Beitrag von Yaslaw
ERLEDIGT
JA
ANTWORTEN
8
ZUGRIFFE
335
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Tommy57 Tommy57 ist offline Mitglied Gold
    Registriert seit
    Dec 2010
    Beiträge
    137
    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 :
    1
    2
    3
    4
    5
    6
    7
    
    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-Code:
    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
     

  2. #2
    Avatar von saftmeister
    saftmeister saftmeister ist offline Der Saft sei mit dir
    tutorials.de Premium-User
    Registriert seit
    May 2006
    Ort
    There is no place like 127.0.0.1
    Beiträge
    3.521
    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

    Code php:
    1
    
    var_dump($_GET);

    wenn du die Parameter über URL überträgst, das gleiche mit $_POST, wenn du ein Formular mit Methode POST übermittelt hast.
     
    Grüße
    --
    Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)

  3. #3
    Tommy57 Tommy57 ist offline Mitglied Gold
    Registriert seit
    Dec 2010
    Beiträge
    137
    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
     

  4. #4
    Avatar von saftmeister
    saftmeister saftmeister ist offline Der Saft sei mit dir
    tutorials.de Premium-User
    Registriert seit
    May 2006
    Ort
    There is no place like 127.0.0.1
    Beiträge
    3.521
    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 :
    1
    
    RewriteRule ^([^\/]+)/([^\/]+)/([^\/]+)/([^\/]+)$ index.php?category=$1&action=$2&$3=$4 [NC,L]
    Tommy57 bedankt sich. 
    Grüße
    --
    Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)

  5. #5
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    
    #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-Code:
    $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); 
    Tommy57 bedankt sich. 
    ---------------------------------------------------------------------------------------------------
    item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
    item: Tutorial: [PHP][MySQL] Debug Queries
    item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
    item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben

  6. #6
    Tommy57 Tommy57 ist offline Mitglied Gold
    Registriert seit
    Dec 2010
    Beiträge
    137
    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-Code:
    $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
     

  7. #7
    Avatar von saftmeister
    saftmeister saftmeister ist offline Der Saft sei mit dir
    tutorials.de Premium-User
    Registriert seit
    May 2006
    Ort
    There is no place like 127.0.0.1
    Beiträge
    3.521
    Zitat Zitat von Tommy57 Beitrag anzeigen
    Nur mein Problem ist jetzt, dass er scheinbar immer Parameter verlangt.
    Gibt es da keine Möglichkeit die angehängten Parameter optional zu lassen.
    Du könntest natürlich eine weitere allgemeine Regel hinzufügen:

    Code :
    1
    
    RewriteRule ^(.*)$ index.php?params=$1 [NC,L]
    Tommy57 bedankt sich. 
    Grüße
    --
    Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)

  8. #8
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    Die Standartwerte hatte ich ja auch. Siehe die Komentare in meinem Code.
    Aber der eval() ist durchaus ein Sicherheitsloch.
    Tommy57 bedankt sich. 
    ---------------------------------------------------------------------------------------------------
    item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
    item: Tutorial: [PHP][MySQL] Debug Queries
    item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
    item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben

  9. #9
    Tommy57 Tommy57 ist offline Mitglied Gold
    Registriert seit
    Dec 2010
    Beiträge
    137
    Super, Code umgeschrieben.
    Vielen Dank für die Hilfe
     

Ähnliche Themen

  1. (Mod-Rewrite) GET-Parameter aus Selectfeld
    Von truckdriver im Forum Sonstige Sprachen
    Antworten: 0
    Letzter Beitrag: 11.07.09, 12:51
  2. mod rewrite
    Von Yoel im Forum Hosting & Webserver
    Antworten: 0
    Letzter Beitrag: 11.02.08, 22:38
  3. mod rewrite
    Von Yoel im Forum CSS
    Antworten: 0
    Letzter Beitrag: 11.02.08, 22:38
  4. Mod Rewrite
    Von putzi im Forum Hosting & Webserver
    Antworten: 10
    Letzter Beitrag: 26.09.06, 15:21
  5. rewrite mod
    Von keymakerFD im Forum PHP
    Antworten: 6
    Letzter Beitrag: 23.08.06, 01:05