Pregunta

Estoy construyendo un sitio web bastante grande y mi .htaccess está empezando a sentirse un poco inflado, ¿hay alguna manera de reemplazar mi sistema actual? ¿Expresión que puede dar cuenta de distintos números de entradas?

por ejemplo actualmente tengo:

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

la primera referencia retrospectiva es siempre la modo y (si existen más) el segundo es siempre identificación, 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.

¿Fue útil?

Solución

Haz como Drupal:

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

Y luego maneja todas las cosas en tu script usando un código php como este

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

Otros consejos

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

Tus reglas mod_rewrite se llamarán repetidamente, lo que te dará lo que a veces se llama recursividad mod_rewrite.Existen técnicas para evitarlo, pero creo que quieres utilizarlas.

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

Siga añadiendo la cadena de consulta de entrada a la salida.Cada vez que pase, su cadena de consulta se hará más larga y su URL se acortará.

Al final, solo tendrá un valor que coincida con su última regla.

Tienes que capturar la cadena de consulta con

RewriteCond %{QUERY_STRING} ^(.*)$

Y luego lo vuelves a agregar a la salida con %1

Terminarías con cuatro líneas.

Sé que comenzaste con cuatro líneas, pero combinarías tantos parámetros como quieras 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 el número de pares parámetro/val.

No creo que haya 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 anteriores.

Entonces, por ejemplo, su regla de 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'] contuviera la información de la 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 $mode que contiene el modo y $path que contiene una matriz de elementos que son el resto de su ruta, por lo que

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

Te dejaría con $mode siendo 'foo' y $path siendo una matriz que contiene 'bar' y 'baz'

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top