Frage

Ich baue eine ziemlich große Website und meine .htaccess beginnt ein bisschen aufgebläht zu fühlen, ist es eine Möglichkeit, mein derzeitiges System der ersetzen - eine Regel für jede der possibile Anzahl von Vars, die weitergegeben werden können, zu ein Haken all Ausdruck, der für eine unterschiedliche Anzahl von Eingängen ausmachen können?

ich zum Beispiel zur Zeit habe:

RewriteRule ^([a-z]+)/([^/]*)/([^/]*)/([^/]*)/([^/]*)/([^/]*)$ /index.php?mode=$1&id=$2&$3=$4&$5=$6
RewriteRule ^([a-z]+)/([^/]*)/([^/]*)/([^/]*)$ /index.php?mode=$1&id=$2&$3=$4
RewriteRule ^([a-z]+)/([^/]*)$ /index.php?mode=$1&id=$2
RewriteRule ^([a-z]+)$ /index.php?mode=$1

die erste Rückreferenzierung ist immer der Modus und (falls mehr vorhanden ist) die zweite ist immer id , danach weiter Rückreferenzierungen wechseln zwischen dem Namen des Eingangs und seinem Wert

http://www.example.com/search
http://www.example.com/search/3039/sort_by/name_asc/page/23

Ich würde gerne in der Lage sein, einen Ausdruck müssen ordnungsgemäß alle Eingaben zu verarbeiten.

War es hilfreich?

Lösung

Sie wie Drupal:

  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]

Und dann behandeln alle das Zeug in Ihrem Skript PHP-Code so etwas wie dies mit

$pathmap = ();
if ($_GET["q"]){
    $path = split("/", $_GET["q"]);
    for ($i=0; $i+1<count($path); $i++){
        $pathmap[$path[$i]] = $path[$i+1];
        $i++;
    }
}

Andere Tipps

Ich weiß nicht, ob es mit einem einzigen Ausdruck getan werden kann, aber es kann mit einer festen Anzahl von Ausdrücken, egal wie lange der Query-String erfolgen.

Ihre mod_rewrite Regeln werden immer wieder genannt werden, Ihnen zu geben, was manchmal mod_rewrite Rekursion genannt wird. Es gibt Techniken zur Vermeidung, aber ich glaube, Sie wollen, es zu benutzen.

Stellen Sie eine Regel auf, die mit Name = Wert &

das letzte Paar ersetzt

Halten Sie auf der Eingabeabfragezeichenfolge mit dem Ausgang anheftet. Jedes Mal durch, Ihre Abfrage-String wird immer länger und Ihre URL wird kürzer.

Schließlich haben Sie nur einen einzigen Wert, der die letzte Regel entspricht.

Sie müssen den Query-String erfassen mit

RewriteCond %{QUERY_STRING} ^(.*)$

Und Sie es fügen Sie dann zurück zum Ausgang mit% 1

Sie würden mit vier Linien enden.

weiß, dass ich vier Zeilen ist, was Sie begann mit, aber Sie würden so viele Parameter entsprechen, wie Sie wollen, ohne eine fünfte Zeile hinzufügen zu müssen.

RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^(.*/)([^/]+)/([^/]+) $1?$2=$3&%1 [L]
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^([^/]+)/ $1.php?%1 [L]

Dies wird neu schreiben die folgende

/mypage/param1/val1/param2/val2/param3/val3/...     --->
/mypage.php?param1=val1&param2=val2&param3=val3&...

Es hört auf, wenn es nur ein Parameter bleiben. Es wird die ersten „Parameter“ nehmen und die Php-Datei mit diesem Namen nennen. Es gibt keine Begrenzung für die Anzahl von param / val-Paaren.

Ich glaube nicht, dass sie ein Weg ist - aber ich würde sagen, dass die beste Wahl das Skript „index.php“ -Prozess einen Weg anstatt zu tun, so viele Rückverweise zu haben sei

So zum Beispiel, Ihre RewriteRule wären

RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

oder ähnlich ... Dies würde dann die $ _SERVER machen [ ‚REQUEST_URI‘] Variable, die die Pfadinformationen enthalten, die Sie teilen und analysieren kann.

$path = split('/', $_SERVER['REQUEST_URI']);
array_shift($path); // We always have a first null value
$mode = array_shift($path);

Dieser Eintrag endet mit $-Modus mit dem Modus auf und $ Pfad eine Reihe von Elementen enthält, die der Rest des Weges ist, so

http://example.com/foo/bar/baz

Möchten Sie verlassen mit $ mode 'foo' zu sein und den Pfad $ ist ein Array mit 'bar' und 'baz'

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top