URLs limpias en los sitios con Apache y archivos .htaccess

Posted: julio 23rd, 2008 | Author: | Filed under: PHP, Recursos Web | Tags: , , , | 2 Comments »

En cualquier sitio que requiera programación, ya sean noticias, productos, categorías, etc., necesitamos agregar URLs que tienen parámetros. Estos parámetros son los que indican a nuestro código la información a cargar, pero los buscadores no ven con buenos ojos estas consultas con parámetros. Por ejemplo:

http://www.sitio.com/noticias.php?date=20080201

Esta url además de no ser amigable para los buacadores no lo es para los usuarios. Si alguien busca en el historial y ve esa dirección no va a recordar fácilmente de que se trata.

Para poder llevar esta URL a algo mas prolijo utilizaremos mod_rewrite de Apache y un archivo .htaccess. Buscamos lograr una url como la siguiente:

http://www.sitio.com/noticias/2008/02/01

Primero que nada necesitamos saber si nuestro servidor Apache tiene habilitado mod_rewrite, para esto podemos ver en el archivo de configuración httpd.conf el cual debe tener descomentada la línea siguiente:

LoadModule rewrite_module modules/mod_rewrite.so

Nota para los que tengan Windows, pueden tener problemas al probar este módulo, en Linux anda a las mil maravillas.

En caso de que el servidor no soporte el módulo o que escriban mal el archivo .htaccess van a ver un mensaje de error por lo que es recomendable probar primero todo en un directorio separado del sitio principal para no bloquear todo haciendo pruebas. Si tuvieron que modificar el archivo httpd.conf van a necesitar reiniciar el servidor.

El siguiente paso es el de crear el archivo .htaccess, nuevamente los que tengan Windows pueden tener algun problema al intentar crear un archivo que empieza con un punto, lo que pueden hacer es abrir el bloc de notas y en Archivo > Guardar Como eligen «Todos los Archivos» y ponen el nombre .htaccess para guardar.

Empecemos con un archivo básico de ejemplo:

RewriteEngine On
RewriteBase /

RewriteRule ^login/ /login.php [L]

Lo que haremos será poner una URL en el navegador, pero queremos que nuestro script reciba el código como si nada hubiera sucedido, para esto reescribiremos las URLs. Las dos primeras líneas indican que vamos a activar el módulo de reescritura y luego indicamos la ruta para esta operación.

A continuación lo que hacemos es indicar nuestra primera regla de modificación, queremos que cuando alguien ingresa a www.nuestrositio.com/login/, en realidad lo envíe al archivo login.php. Para esto indicamos la palabra a buscar y luego indicamos el archivo php al cual se reenviará el pedido. Claro que esto sucede del lado del servidor, por lo que el visitante del sitio no ve nada «raro» al acceder.

Veamos ahora un ejemplo en el que queremos pasar parámetros en forma limpia a un archivo php:

RewriteRule ^noticias/([0-9]*)/ /noticias.php?id=$1 [L]

Podemos agregar una segunda regla, una por línea y manteniendo las dos primeras línea del archivo .htaccess. Esta nueva regla utiliza una cadena de texto «noticias» y luego una expresión regular para pasar al archivo php un parámetro como variable GET[‘id’].

La expresión regular de este ejemplo recibe números del 0 al 9 (el asterisco indica que pueden ser muchos) y los pasa al archivo noticias.php donde aparece la variable $1. Si tenemos varios parámetros podemos poner varias expresiones regulares y variables para cada una $1, $2, $3…

Vemos ahora un ejemplo en el cual pasamos letras también:

RewriteRule ^noticias/([a-zA-Z0-9\(\)+%_-]*)/ /noticias.php&title=$1 [L]

En este caso la expresión regular acepta letras de la «a» a la «z», de la «A» a la «Z» (las expresiones son sensibles a mayúsculas, por eso ponemos los dos casos), también acepta números así como algunos caracteres: ( ) + % _ –

Noten que para los paréntesis necesitamos utilizar la barra de escape «\»la cual indica que vamos a poner un caracter que la expresión puede «confundir» con otra cosa. Este caracter nos sirve para estos casos especiales.

Para seguir ahondando en ejemplos necesitamos tener un manejo de expresiones regulares, tema que escapa a esta entrada específica.