PHP: friendly url

Anteriormente había escrito sobre el funcionamiento de friendly url pero aún hay muchos que están en duda sobre su funcionamiento así que voy a aprovechar de hacer un ejemplo práctico muy sencillo sin usar web modular (que es para lo que normalmente sirve) para que sea lo más simple posible.

Lo básico en URL amigable

Lo primero debemos asegurarnos de tener activo el módulo mod_rewrite de lo contrario dará un error “Internal Server Error” o simplemente no funcionará, luego creamos un archivo .httacess

1
2
3
4
5
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /micarpeta/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

Allí primero verificamos el mod_rewrite luego seteamos la RewriteBase es decir la carpeta donde esta nuestro sitio, si se tratara de www.misitio.com esa línea sería:

1
RewriteBase /

Las 2 últimas líneas nos dicen que de existir ese archivo o carpeta se olvide de la URL amigable y use esos archivos

Creando pagina.html

Para esto en nuestro archivo.httacess añadimos:

1
RewriteRule (.*)\.html$ index.php?page=$1

Esto genera una equivalencia entre
index.php?page=mipagina
mipagina.html

Para emular carpetas

Para esto en nuestro archivo.httacess añadimos:

1
2
RewriteRule /local/(.*)/ index.php?page=local&link=$1
RewriteRule local/(.*) index.php?page=local&link=$1

Esto va a generar una equivalencia entre:
index.php?page=local&link=restaurante-san-jose
www.misitio.com/local/restaurante-san-jose/

La cantidad de parámetros y de nombres de las variables depende de cada caso en concreto

Uso de las variables

Todas las variables GET que creamos tanto con friendly URL como sin esta mantienen sus nombres por ejemplo en el caso:
index.php?page=local&link=restaurante-san-jose
www.misitio.com/local/restaurante-san-jose/

Las variables creadas en ambas direcciones son: page que tiene el valor local y la variable link que tiene el valor restaurante-san-jose

Debemos tener claro que con url amigable lo único que estamos haciendo es disfrazar la dirección pero este disfraz altera las rutas relativas por lo que posiblemente fallen todas las invocaciones a hojas de estilos, javascripts e imágenes que se hayan hecho sin usar una ruta absoluta, para remediar esto hay 2 posibles soluciones:

Alterando la ruta base(basepath)

Esta es la más simple y rápida basta con agregar la siguiente linea HTML en el encabezado de nuestra página web

1
<base href="http://www.misitio.com/" />

Usando un path absoluto

Esta es la solución que más se utiliza debido a que la otra solución puede no funcionar en algunos navegadores especialmente en los antiguos (IE6 por ejemplo tiene varios peros), lo que hacemos es guardar la ruta absoluta en una constante que luego usaremos cada vez que invoquemos una imagen, css o javascript.

1
2
3
define("_path", "http://misitio.com/");
// Para invocar una imagen por ejemplo
<img src="<?php echo _path; ?>miimagen.jpg" />

De esta forma hay algunas variantes usando short open tags, templates, funciones, etc pero la idea básica es la misma.

Pueden ver un ejemplo funcionado AQUI
No doy link a los archivos del ejemplo ya que su funcionamiento varía según la carpeta donde se le coloque, por lo que terminarían dando más problemas que soluciones.

5 comentarios en “PHP: friendly url

  • Hola Miguel,
    Buscando una solución a un problema que he encontrado en mi web http://www.inmobiliarias-punta-del-este.com , he llegado a tu web quizá sea un poco atrevido hacerte una consulta ya que veo que dominas programación, en la web arriba comentada he entrado hoy, y me abre una web rumanana:
    http://programmengineering.ru/check/index.php
    la cual no llega ni abrir, no tengo mucha idea de programación, hace un tiempo me pegaron scripts que google los detectaba como software malintencionado, en los index.php, los borre y ya esá, pero la verdad que este problema no se solucionarlo, te agradecería una opinión de lo que puede ser. Gracias por adelantado.

  • Hola,

    sólo quería agradecerte tu artículo, ya que después de ller un montón de ellos, incluso de fenómenos guiris, el tuyo me ha dado la solución que quería respecto a los path relativos, que en todos los tutoriales no advierten de su problemática. Así pues, enhorabuena por tu trabajo y esfuerzo!

  • La ruta base no es necesario alterarla, pueden averiguar en donde se localizan, y cargarlo en una variable que puede utilizar ya sea en un include, o como gusten, les dejo el ejemplo aca:

    $host = $_SERVER[‘HTTP_HOST’];
    $uri = rtrim(dirname($_SERVER[‘PHP_SELF’]), ‘/\\’);

    Saludos desde Costa Rica

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Time limit is exhausted. Please reload the CAPTCHA.