viernes, 20 de marzo de 2009

Configurar Apache para usar URL's amigables

Dado que en el proyecto en el que estoy participando en mi trabajo requieren que generemos URL's amigables, me dí a la tarea de investigar sobre este tema. Este artículo describirá de forma breve los pasos que necesitamos para que Apache cree las URL's correctamente e interprete los valores de las variables que se envían. Al finalizar mostraré con un ejemplo sencillo en PHP el valor de las variable que se envía por el URL.

El primer paso que deberemos hacer es instalar Apache. Para no volver a explicar como instalarlo dado que ya lo postié en otro artículo dejo AQUÍ la liga. En este artículo tendremos que hacer unos cambios pequeños que a continuación describiré y también para que funcione bien el ejemplo deberemos instalar PHP como indico AQUÍ TAMBIÉN.
Cuando en el artículo de instalación de Apache lleguen a la línea:

$ cp /ruta/donde/se/bajo/httpd-2.2.8.tar.bz2 /usr/local/src/
$ cd /usr/local/src/
$ tar -jxvf httpd-2.2.8.tar.bz2
$ cd httpd-2.2.8
$ ./configure --prefix=/usr/local/apache --enable-module=so
o
$ ./configure --prefix=/usr/local/apache --enable-so

Deberemos agregar la opción --enable-rewrite=shared la cuál nos permitirá reescribir para poder generar nuestras rutas.

La opción quedaría similar a lo siguiente:

$ cp /ruta/donde/se/bajo/httpd-2.2.8.tar.bz2 /usr/local/src/
$ cd /usr/local/src/
$ tar -jxvf httpd-2.2.8.tar.bz2
$ cd httpd-2.2.8
$ ./configure --prefix=/usr/local/apache --enable-module=so --enable-rewrite=shared
o
$ ./configure --prefix=/usr/local/apache --enable-so --enable-rewrite=shared

Después de esto, continuaremos con la instalación que se describe en el artículo de instalación de Apache.

Una vez que ya se tiene instalado Apache deberemos editar como usuario root el archivo /usr/local/apache/conf/httpd.conf y deberemos buscar las líneas donde encontremos la palabra AllowOverride None y deberemos cambiarla por AllowOverride All, por ejemplo, y la encontré en dos lugares:

<Directory />
Options FollowSymLinks
#AllowOverride None
AllowOverride All
</Directory>

#
# AllowOverride controls what directives may be placed in .htaccess files.
# It can be "All", "None", or any combination of the keywords:
# Options FileInfo AuthConfig Limit Indexes
#
#AllowOverride None
AllowOverride All

En el artículo menciono que podemos crear alias como el siguiente:

    # If you include a trailing / on /webpath then the server will
# require it to be present in the URL. You will also likely
# need to provide a section to allow access to
# the filesystem path.

Alias /javoaxian "/home/javoaxian/htdocs"
<Directory /home/javoaxian/htdocs>
AllowOverride FileInfo AuthConfig Limit Indexes
Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
<Limit GET POST OPTIONS PROPFIND>
Order allow,deny
Allow from all
</Limit>
<LimitExcept GET POST OPTIONS PROPFIND>
Order deny,allow
Deny from all
</LimitExcept>
</Directory>

Y para poder usar también los URL's amigables deberemos cambiar la opción AllowOverride.

    # If you include a trailing / on /webpath then the server will
# require it to be present in the URL. You will also likely
# need to provide a section to allow access to
# the filesystem path.

Alias /javoaxian "/home/javoaxian/htdocs"
<Directory /home/javoaxian/htdocs>
#AllowOverride FileInfo AuthConfig Limit Indexes
AllowOverride All
Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
<Limit GET POST OPTIONS PROPFIND>
Order allow,deny
Allow from all
</Limit>
<LimitExcept GET POST OPTIONS PROPFIND>
Order deny,allow
Deny from all
</LimitExcept>
</Directory>

Recuerden que una vez que hayan guardado estos cambios necesitarán reiniciar su Apache en caso de que este iniciado.

Con ésto ya tenemos casi configurado nuestro Apache, ahora lo que falta es crear el archivo .htaccess el cual nos permitirá crear las reglas que necesitamos para que se interprete el URL.

El archivo .htaccess deberá crearse dentro del directorio htdocs de nuestro sitio o en alguno de los directorios dentro de este directorio. Yo crearé un directorio llamado urls dentro del directorio /usr/local/apache/htdocs y en este directorio colocaré el archivo .htacces.

javoaxian@darthmaul:~$ su -
Password:
root@darthmaul:~$ cd /usr/local/apache/htdocs
root@darthmaul:~$ mkdir urls

El contenido del archivo será el siguiente:

<ifmodule mod_rewrite.c>
RewriteEngine On
Rewriterule ^nota/(.+)/(.+) nota.php?id=$1&titulo=$2
</ifmodule>

Ahora explicaré el archivo .htaccess.
Las etiquetas <ifmodule mod_rewrite.c> </ifmodule> indican que si está instalado el módulo mod_rewrite haga lo que está entre esas etiquetas.

La línea RewriteEngine On indica que vamos a habilitar el modo de reescritura de las URL's.

La línea: Rewriterule ^nota/(.+)/(.+) nota.php?id=$1&titulo=$2 crea una expresión regular donde le decimos que el URL será formado de la siguiente manera: http://localhost/urls/nota/numero/titulo-nota donde en este URL /nota representa el nombre del archivo, /numero equivaldría a la variable id=$1 que se especifíca en la expresión regular y /titulo equivale a la variable &titulo=$2. Por tal motivo, si yo pongo el siguiente URL amigable:

http://localhost/urls/nota/1/mi-primer-noticia

será lo mismo que si hubieramos escrito:

http://localhost/urls/nota.php?id=1&titulo=mi-primer-noticia

Hay muchas forma de crear nuestras expresiones regulares, aquí puse una muy sencilla y para fines prácticos.

Ahora bien, si ustedes estuvieran poniendo el archivo .htaccess dentro de un alias que hubieran creado, como es el caso del artículo que mencioné y en donde el alias está dirigido a http://localhost/javoaxian, crearíamos el directorio urls dentro del directorio /home/javoaxian/htdocs.

javoaxian@darthmaul:~$ javoaxian@darthmaul:~$ cd /home/javoaxian/htdocs
javoaxian@darthmaul:~$ mkdir urls

Y el contenido del archivo .htacces variará un poco ya que en lugar de poner ^nota/(.+)/(.+) colocaremos ^nota.php/(.+)/(.+). Esto quedaría así:

<ifmodule mod_rewrite.c>
RewriteEngine On
Rewriterule ^nota.php/(.+)/(.+) nota.php?id=$1&titulo=$2
</ifmodule>

Ahora por último crearemos nuestro programa de PHP el cual nos mostrará el valor de las variables. Por tal motivo crearemos el archivo nota.php y el contenido de este será:

<?php echo "ID: " . $_GET['id'] . " TITULO: " . $_GET['titulo'] ?>

Guardaremos el archivo y ahora en nuestro navegador entraremos a:

http://localhost/urls/nota/1/titulo-de-la-nota

o si están probandolo con el alias:

http://localhost/javoaxian/urls/nota/1/titulo-de-la-nota

A lo cual el programa les mostrará:

ID: 1 TITULO: titulo-de-la-nota

Listo, con esto ha quedado configurado nuestro Apache para interpretar URL's amigables.