URLs Amigables en PHP y htaccess pasando parámetros dinámicos

  • Comentarios de la entrada:Sin comentarios
  • Tiempo de lectura:6 minutos de lectura

Como bien sabemos, para obtener un buen posicionamiento en los buscadores como Google o Bing, es muy importante disponer de las URLs amigables en nuestra página web. Entiendo que ya se conoce el concepto de URL amigable y no lo voy a explicar, pero si explicaré cómo implementarlas en un desarrollo realizado con PHP. Para ello me basaré en un ejemplo muy sencillo. No obstante indicaros que este artículo está enfocado a programadores con ciertos conocimiento en programación ya que hay conceptos que no los termino de esplicar porque ya se entienden.

Pero antes de nada, y lo más importante es decirle a nuestro archivo htaccess que se encuentra en el directorio raiz del desarrollo web, que vamos a emplear este sistema. Y lo haremos de la siguiente manera:

Options All -Indexes
RewriteEngine On

RewriteRule ^([-a-zA-Z0-9/_]+)$ index.php?enlace=$1

Lo más importante es la expresión regular que emplearemos para capturar las URs que recibe el archivo htaccess que explico a continuación:

[-a-zA-Z0-9/_]

Entre los corchetes [ ] le estoy indicando que las URLs que recibirá el archivo htaccess contendrá guiones centrales (-) letras minúsculas de la a a la z (a-z), igualmente en mayúsculas (A-Z), también números del 0 al 9 (0-9) además le incluyo algúnos caracteres especiales como la barra invertida (/) y la barra baja (_) que también podría emplear para nombrar alguna páginas. Toda URL que incluya algún caracter que no esté incluido en la expresión regular será ignorada por el htaccess y no funcionará. Es decir, serán váliods nombres como: clientes_nuevos.php, clientesNuevos.php, clientes-nuevos.php

Supongamos que tenemos una página que hace de menú principal donde iremos cargando los diferentes contenidos de nuestra web. Además le pasaremos un parámetro como el ID del cliente para poder editarlo. La página se llamará index.php y contendrá el siguiente código:

<?php 
include "vistas/paginas/menu.php";

$rutas = array();
if(isset($_GET["enlace"])){ 
 $rutas = explode("/", $_GET["enlace"]); 
  if($rutas[0]=="inicio" || 
   $rutas[0]=="clientes_listado" || 
   $rutas[0]=="clientes_nuevo" ||
   $rutas[0]=="clientes_actualizar" ||
   $rutas[0]=="clientes_eliminar" ||
   $rutas[0]=="salir"
  ){ 
   include "vistas/paginas/".$rutas[0].".php"; 
  }else{
   include "vistas/paginas/404.php";
 }
}

include "vistas/paginas/pie.php";
?>

 

Como se puede ver en este código, primero estoy cargando la página menu.php mediante un include. Al final de código también cargo el pie de página.

Deciros que para este ejemplo utilizaré el sistema de estructura de programación Controlador, Modelos y Vistas y también mostraré la manera de que nuestras URLs nunca indiquen la ruta completa de donde se encuentran. En este ejemplo todas las páginas de contenidos se encontrarán en el directorio Vistas/paginas, pero sus URLs no mostrarán dicha estructura.  En la página menu.php incluiré los enlaces a las diferentes opciones del contenido de la página web. En este ejemplo pondré una sola opción que se llamará clientes y que mostrará un listado de clientes. El código para este enlace es:

<a href="<?=$nombreDominio?>clientes_listado" class="nav-link">Clientes</a>

Como se puede ver en el href del enlace no le paso la extensión .php al nombre de la página que quiero abrir. En este caso la Página que tendrá el listado de los clientes. Previamente al nombre de la página le estoy adjuntando una variable de php que contiene la ruta completa de la página. Esta variable la podemos definir al principio de la página index.php de esta manera:

$nombreDominio="http://localhost/miproyecto/";

Cuando el usuario pulsa sobre la opción Clientes, esta opción envia por hRef el nombre clientes_listado que posteriormente se recoge en la variable $rutas que está definida como un array (Podemos verlo en la línea 2 del código) Después y mediante la función explode (línea 4) introducimos el href enviado. En este caso como no recibe inigín parámetro de cliente, el array solamente tiene un valor en la posición [0] que sería listado_clientes y después en la línea 5 mediante una sentencia condicional:

if($rutas[0]==

direccionamos a la página real que queremos y le añadimos la extensión .php de esta manera se abrirá la página indicada mostrando su contenido, pero en la URL del navegador solamente se mostrará http://localhost/miproyecto/clientes_listado aunque esta pagina realmente se encuentre en la ruta: http://localhost/miproyecto/vistas/paginas/clientes_listados.php

En caso de escribir una URL diferente a las que están definidas en el código, se mostrará la página de error 404.php

Bien, con esto ya podemos crear URLs amigables y esconder nuestra estructura de carpetas de la vista de los curiosos.

¿Cómo envío y recojo parámetros con este sistema?

Enviar parámetros y recogerlos es muy sencillo. Imaginemos que en el listado de clientes, hay unos botones en la misma fila de cada cliente, para editar o eliminar un cliente determinado. Pues bién, en ese botón, por ejemplo en el de editar le pondremos el siguiente código:

<a href="clientes_actualizar/<?=id_cliente;?>" class="btn btn-warning" title="Editar" data-toggle="tooltip"><i class="far fa-edit"></i></a>

Como vemos en el href le pasamos el nombre de la página que recibirá el parámetro del ID del cliente a Editar. Ese parámetro se lo pasamos escribiendo una barra inclinada (/) a continuación del nombre de la página y posteriormente le añadimos el ID del cliente en PHP. Esto es un ejemplo y vosotros tenéis que obtener ese ID dinámico mediante vuestro propio código. Lo esencial es que cojáis el concepto.

Cuando se pulse sobre este enlace se estarán enviando 2 parámetros, el nombre de la página que se recogía en el array $rutas[0] y el ID del cliente que se está recogiendo en $rutas[1]

Una vez se abra la página clientes_actualizar que contendrá el código necesario para mostrar los datos del cliente y poder editarlos, cogeremos el parámetro del ID del cliente mediante la variable $id=$rutas[1];

Con el valor de la posición 1 del arrau $rutas podremos encontrar a nuestro cliente mediante un SELECT a la base de datos y mostrar sus resultados.

 


Comparte en tus Redes Sociales:

Deja una respuesta