URL rewriting

Te comento lo que necesito. Tengo una web que saca material de una base de datos mySQL. La página está programada en PHP. La web en sí tiene varias carpetas cada una por una sección. Tengo trucos/ , juegos/ , /descargas/ y dentro de cada carpeta pues el correspondiente fichero vertruco.php, verjuego.php y verdescarga.php a los que les paso las variables y me ponen por pantalla lo que les pido. Mi pregunta es esta.
Las URL no me gustan y me han comentado el mod_rewrite de apache para cambiar una url por una que parezca que es html.
Me han dicho que es poniendo unas líneas en el fichero .htaccess, pero ni idea de como va ya que aún mirando documentación por la red, no me aclaro.
En la sección de trucos la url php con las Variables es:
el código PHP de Idtruco=200 es: IdTruco=<?php echo $row_rsVerTruco['IdTruco'];?>
vertruco.php?IdTruco=200, me gustaría que en la barra de navegación apareciese algo como trucos/200/ver.html
¿Cómo se hace esto pues?.
Por otro lado, recuerda que te había dicho que tengo 3 secciones. Por ejemplo en la de juegos la url es:
verjuego.php?nombre=Nombre_juego&soporte=soporte_juego
que quedaría mejor como juegos/nombre_juego/soporte_juego
como te puse en el ejemplo de trucos, saco los datos de la base como
nombre=<?php echo $row_rsInfoJuego['nombre'];?>&soporte=<?php echo $row_rsInfoJuego['soporte'];?>
Por si necesitas saberlo.
Te pongo dos ejemplos para hacerte otra cuestión relacionada. Como te escribí líneas arriba, cada fichero verjuego, vertruco... .php están en sus respectivas carpetas. ¿Para poner el Rewrite en el .htaccess puedo hacerlo con todas en el .htaccess raíz o tengo que hacer un .htaccess especial para cada carpeta?
Muchas gracias, espero que me ayudes y que hayas entendido bien lo que te pregunto.

2 respuestas

Respuesta
He estado investigando en tu asunto, pero desgraciadamente me ha sido imposible implementar lo que he leído en mi servidor local, ya que no dispongo de dominio propio ni de ip fija. Pero lo que si puedo es remitirte a una guía que viene en la página de apache...
http://httpd.apache.org/docs/misc/rewriteguide.html
La explicación que ahí viene trae varios ejemplos.
Pero por otra parte, ¿por qué quieres modificar las url? La verdad es que no entiendo bien porque quieres hacer ese cambio. Porque no envías las variables con POST para que no aparezcan en la url y pones un titulo juegos/200/soporte a la página que los muestra. Es más sencillo, y menos transparente para los visitantes.
En fin, un saludo. Lamento no poderte ser de mucha ayuda.
Respuesta
-1
Lo primero que necesitas es editar el fichero httpd.conf de apache y quitar el comentario de la línea:
#LoadModule rewrite_module modules/mod_rewrite.so
que tiene que quedar:
LoadModule rewrite_module modules/mod_rewrite.so
Ahora añades las siguientes líneas:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule /trucos/([0-9]+)/ver.html /trucos/vertruco.php?idTruco=$1
</IfModule>
Lo que hace esto es que cuando tu escribes en el navegador lo siguiente:
http://localhost/trucos/542/ver.html
la página que realmente se muestra es:
http://localhost/trucos/vertruco.php?idTruco=542
Donde pone localhost es este ejemplo, será el dominio del servidor que tengas configurado en apache.
Para juegos haces algo parecido. Las expresiones regulares tienes que adaptarlas al contenido.
RewriteRule /juegos/([a-z]+)/([a-z]+) /juegos/verjuego.php?nombre=$1&soporte=$2
Esta línea la colocas en el mismo bloque que la anterior. En este ejemplo puedes poner como nombre y soporte palabras compuestas por los caracteres de la 'a' a la 'z'.
No necesitas usar .htaccess. Tienes más información en:
http://www.sitepoint.com/article/guide-url-rewriting
El problema es que tengo que hacerlo con el .htaccess, ya que no puedo modificar el httpd.conf del apache.
Gracias.
Es muy parecido. Ese fichero tiene que estar en el raíz de tu sitio web. En el fichero .htaccess tienes que poner un código parecido al siguiente.
Options +FollowSymlinks
RewriteEngine on
RewriteRule ^trucos/([0-9]+)/ver.html /trucos/vertruco.php?idTruco=$1
Si al final de la regla añades [nc] haces que no se distinga entre mayúsculas y minúsculas.
En ese fichero tendrías que poner todas la reglas. Pero también puedes crear un fichero .htaccess para cada directorio y evitar tener que poner la ruta.
GRacias. ¿Cómo tendría que hacer si la variable que le paso al PHP en una cadena de caracteres con mayúsculas y minúsculas como por ejemplo "Truco del Registro de Windows"?. ¿Sería con [a-zA-Z]+?. ¿Y en el caso de que lleven tildes y demás como puede ser una ñ?.
Muchas gracias por todo.
No me defiendo muy bien con las expresiones regurales, pero quizá puedas poner lo siguiente:
([a-z]|[A-Z])+
No me hagas mucho caso. Pruébalo.
Respecto a las tildes y otros caracteres, creo que tendrías que ponerlos uno a uno separados por el carácter |
He buscado por internet y no aclara gran cosa, ya sabes, la mayoría de la documentación está en inglés y no usan tildes. De todas formas es buena práctica no usar caracteres especiales ya que algunos navegadores podrían no reconocerlos de forma correcta.
Otra idea sería usar una función para reemplazar tildes y caracteres especiales por otros antes de usar la expresión regular, por ejemplo:
ereg_replace( "ñ", "n", $url);
$url es la variable donde tendrías el $url que pasas por la expresión regular.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas