Rewriterule

Hola,
estoy liado con esto del rewriterule y quería hacer algo así:
- pasar la url www.dominio.com/encuesta.php?id=3&lengua=es
- a www.dominio.com/encuesta/3/es/
Mi idea es que la url redireccione pero no hay manera.
Muchas gracias!

4 respuestas

Respuesta
1
Bien, perdona el retraso, pero he tenido que instalar apache en mi ordenador porque contra un server no veía los errores.
www.dominio.com/encuesta.php?id=3&lengua=es
www.dominio.com/encuesta/3/es/
Importante! Pon esto delante de las RewriteRules que escribas, además estos ficheros son casesensitive, respeta las mayúsculas y minúsculas!
RewriteEngine On
Luego
RewriteRule ^encuesta.php?id=([0-9]+)&lengua=([A-Za-z]+)$ /encuesta/$1/$2/ [R]

Todo en la misma linea, como es posible que no funcione, te explico en qué consiste la idea:
^encuesta.php?id=([0-9]+)&lengua=([A-Za-z]+)$
Con esto decimos que aquella ocurrencia que empezando ^ por encuesta.php?id= luego el numero que sea, tantas veces como sea ( ([0-9]+) en el ejemplo es un 3 pero puede ser 23, 344, 38749847398274972) seguido de &lengua= y a continuación un texto sea el que sea ([A-Za-z]+) , se sustituye por: /encuesta/$1/$2/  siendo $1 y $2 los textos extraidos de la primera cadena en total: /encuesta/3/es/
Espero que te sea de utilidad, si no funciona (cosa bastante probable, porque es dependiente de la conf del server) dime el error que te da, [R] muestra detalles sobre la redirección, si se produce algún error lo mostrará.
Hola!
Muchas gracias por la respuesta, esta tarde noche lo pruebo y te comento.
De nuevo muchas gracias, un saludo.
Ya me dirás que tal.
Hola,
¿He hecho una prueba pero me fijo que todo lo que aparece detrás de .php? No lo lee, te enseño el ejemplo:
http://www.davidegea.com/enquesta/resultats.php?id=2&llengua=es
La idea es que esto pase a ser http://www.davidegea.com/enquesta/resultats/2/es/, por eso he puesto esto en el .htaccess
Options +FollowSymlinks
RewriteEngine on
RewriteRule ^resultats.php?id=([0-9]+)&llengua=([A-Za-z]+)$ /resultats/$1/$2/ [R]
No me sale ningún error, no sé si poniendo alguna cosa me lo puede imprimir en pantalla. Me ha dado hacer la prueba poniendo resultats.php y funcionaba pero claro... las variables GET no las coge.
Seguimos en contacto, muchas gracias!
He encontrado una posible solución, a ver como lo ves. En vez de usar el htaccess he puesto este código en la cabecera:
if (substr($_SERVER['PHP_SELF'], -3) == 'php')
{
header("HTTP/1.1 301 Moved Permanently");
header('Location: /enquesta/'.$_GET['llengua'].'/'.$_GET['urltitol'].'/'.$_GET['id'].'/');
}
De esta manera me lo hace correcto, lo malo es que deberé ir archivo por archivo.
Si la opción del htaccess aún la ves factible me lo comentas, un saludo y muchas gracias.
David Egea
Olvida lo dicho, lo que te he puesto funciona cuando los archivos son diferentes pero no cuando se trata del mismo ya que se produce un bucle infinito.
Sigo en el mismo punto, cualquier cosa te lo comento.
Añade un if para comparar el document actual con el que quieres redirigir, si son diferentes redirecciona, si no que cargue el documento actual.
¡Logrado! Te indico lo que he tenido que poner en la página que quiero que cambie la url:
$cadena_sense_get=explode("?",$_SERVER['REQUEST_URI']);
if (substr($cadena_sense_get[0], -3) == 'php')
{
header("HTTP/1.1 301 Moved Permanently");
if($_GET['llengua']=="") header('Location: /links/');
else header('Location: /links/'.$_GET['llengua'].'/');
}
Estaba usando en vez de REQUEST_URI el PHP_SELF. Claro, el PHP_SELF siempre saca el archivo .php pero el REQUEST_URI siempre devuelve la url que hay en el navegador. En el caso de haber archivo .php haremos el Header Location.
Como el REQUEST_URI devuelve todo y yo quiero saber si hay o no archivo .php he hecho el explode. Y funciona.
Muchas gracias por escribir y echarme una mano, tus aportaciones me han ayudado a ver otras opciones y resolver el problema.
Un saludo.
Respuesta
1
La expresión regular que deberías poner en este caso, creo que sería:
RewriteRule ^encuesta/(.+)/(.+)/? encuesta.php?id=$1&lengua=$2
Donde he permitido que se ponga o no la barra final después del 'es'. Si quieres forzar a que el usuario ponga la barra, quita el primer interrogante.
Hola,
gracias por tu respuesta, te comento que ya he conseguido que las direcciones amigables funcionen tal y como tú me has explicaso.
Mi idea es que si alguien accede desde una dirección antigua con archivos php y variables GET se le transforme automáticamente a una dirección amigable. El problema es que al haber mil posibilidades a nivel de variables GET (desde identificadores hasta lenguas) no he sabido sacarlo aún.
No entiendo lo que dices. Por un lado dices que funciona pero por otro ¿qué no has sabido sacarlo?
Según esta regla, cualquier URL del tipo:
www.tudominio.com/encuesta/2/4/
producirá una llamada a encuesta.php?id=2&lengua=4
Por lo que siempre se llamara al mismo fichero encuesta.php y allí podrás consultar los valores de id y de lengua en $_GET["id"] y en $_GET["lengua"] y actuar en consecuencia.
Respuesta
1
Respuesta
-1
Busca en google "urls amigables", es lo que necesitas.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas