lupo: mod_rewrite: Ersetzen im Query String

Ich möchte mit mod_rewrite global für die ganze Seite Teile des Query Strings ersetzen.

Also z.B. aus
http://www.xyztest.com/index.php?test=bar
http://www.xyztest.com/index.php?test=foo
machen.

Das ganze müsste mit Wildcards für die ganze Seite sein, da es mehr als nur index.php gibt und der Query String auch mehrere Einträge haben kann, wie z.B.:
http://www.xyztest.com/test/search.php?test=bar&search=string

Es soll eben immer "test=bar" durch "test=foo" ersetzt werden.

Kann mir jemand auf die Sprünge helfen? :)

  1. <?
    $test = $_GET['test'];
    if ($test == 'bar')
    {
    $test = 'foo';
    ?>
    <form name='form' action='<? echo $PHP_SELF.'?test='.$test; ?>' method="post">
    <script language = 'JavaScript'>
    document.form.submit();
    </script></form>
    <?
    }
    echo $_SERVER['REQUEST_URI'];
    ?>

    eine von vielen moeglichen varianten =)

    gruss aus lux.

    1. eine von vielen moeglichen varianten =)

      Ja, ich müsste es aber via mod_rewrite/htaccess machen. :)
      Es geht darum, dass die Seiten Ihre Querystring-Struktur verändern und das Besucher die über die alten URIs (z.B. von Suchmaschinen) kommen auf die neuen umgeleitet werden.

  2. Hallo erstmal,

    Es soll eben immer "test=bar" durch "test=foo" ersetzt werden.

    Kann mir jemand auf die Sprünge helfen? :)

    vielleicht.
    An der reg-ex für die 2. RewriteCond musst du evtl. noch feilen, bin da kein Experte drin, habs auch so wie hier nicht direkt probiert, aber es kommt ja aufs Funktionsprinzip an :-)

    RewriteCond %{REQUEST_URI} ^(.*)([?|&]test=bar)+(.*)$
      RewriteRule (.*) /umleiter.php [R=seeother,L,QSA]

    Besonderes Interesse gilt ?test=bar oder &test=bar, und ([?|&]test=bar) ist vermutlich total flasch ;)

    Hier ist die Bedingung dass "irgendwas mit "test=bar" in der URI an umleiter.php verweisen wird, alle anderen werden ignoriert.
    Der wird als Status 303 Skript gestartet und bekommt die original-URI mit um was cleveres dawas anzufangen.
    Dort verfährst du am besten wie helpercenter schon beschrieben hat und schliesst dort mit einen (zweiten) header("Location: neue-uri")
    Das dürfte am flexibelsten sein, insbesondere für zukünftige Parameter-Umschiebereien.

    Theoretisch könnte die RewriteRule auch so aussehen, was dir die RewriteCond und den "umleiter" spart. Bin aber auch hier nicht ganz sicher:

    RewriteRule ^(.*)([?|&]test=bar)+(.*)$ index.php$1$3&test=bar [NC]

    $1 und $2 sind die beiden (.*) Ausdrücke.

    Teste die RegEx am besten ausserhalb von .htaccess mit einem normalen Skript mit preg_match() und ein paar Beispielstrings um zu sehen was dabei herauskommt.

    Viel Spaß,
    CirTap

    --
    You can have programs written fast, well, and cheap, but you only get to pick 2 ...
    "Jeder der noch keinen Fehler gemacht hat, hat noch nie etwas Neues ausprobiert." (A. Einstein)