apache mod_rewrite una regla para cualquier cantidad de posibilidades

Estoy construyendo un sitio web bastante grande y mi .htaccess está empezando a sentirse un poco hinchado, ¿hay alguna manera de reemplazar mi sistema actual de – una regla para cada uno de los posibles valores que se podrían pasar, para capturar todo expresión que puede dar cuenta de un número variable de entradas?

por ejemplo, actualmente tengo:

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

la primera referencia inversa es siempre el modo y (si hay más) el segundo siempre es id , a partir de entonces cualquier referencia posterior alterna entre el nombre de la entrada y su valor

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

Me encantaría poder tener una expresión para manejar con gracia todas las entradas.

Haz como Drupal:

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

Y luego maneje todas las cosas en su script usando el código php algo así

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

No sé si se puede hacer con una sola expresión, pero se puede hacer con un número fijo de expresiones, sin importar cuánto tiempo sea la cadena de consulta.

Sus reglas mod_rewrite serán llamadas repetidamente, dándole lo que a veces se llama recursión mod_rewrite. Existen técnicas para evitarlo, pero creo que quieres usarlo.

Configure una regla que reemplace el último par con nombre = valor &

Siga marcando la cadena de consulta de entrada a la salida. Cada vez que lo haga, su cadena de consulta será más larga y su URL será más corta.

Finalmente, solo tiene un valor único que coincida con su última regla.

Tienes que capturar la cadena de consulta con

 RewriteCond %{QUERY_STRING} ^(.*)$ 

Y luego lo agrega de nuevo a la salida con% 1

Terminarías con cuatro líneas.

Sé con qué comenzaste con cuatro líneas, pero coincidirías con tantos parámetros como quisieras sin tener que agregar una quinta línea.

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

Esto reescribirá lo siguiente

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

Se detiene cuando solo queda un parámetro. Tomará el primer “parámetro” y llamará al archivo .php con ese nombre. No hay límite para la cantidad de pares param / val.

No creo que sea una manera, pero diría que lo mejor sería que el script “index.php” procese una ruta en lugar de tener que hacer tantas referencias.

Entonces, por ejemplo, su reescritura sería

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

O similar … Esto haría que la variable $ _SERVER [‘REQUEST_URI’] contenga la información de ruta, que puede dividir y analizar.

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

Esto termina con el modo $ que contiene el modo y $ ruta que contiene una matriz de elementos que son el rest de su ruta, por lo que

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

Te dejaría con $ modo siendo ‘foo’ y $ path siendo una matriz que contiene ‘bar’ y ‘baz’