24 nov 2011

Redirigiendo peticiones en Apache


Esta es una de esas tareas sencillas que donde se complique un poco prepárate para perder más tiempo del que pensabas. Cuando buscamos redirigir peticiones con Apache, más si no implica reescribir direcciones o algo complejo, una de la opciones más simple es utilizar un archivo .htaccess en el directorio que nos interesa modificar el comportamiento, el tema es que no basta solo con eso ya que hay una pequeña serie de cosas a tener configuradas para que funcione.
La solución básica como comentaba es utilizar este tipo de archivos que contienen directivas para modificar el comportamiento del servidor, Apache verifica su existencia antes de responder habiendo infinidad de opciones desde simples como no listar los archivos en un directorio hasta cosas más elaboradas como sustituir partes de una URL, manejar errores y demás.

En este caso la directiva que nos interesa se llama Redirect, siendo su sintaxis:

Redirect 301 /Directorio/old_index.php http://localhost/Directorio/new_index.php


Aquí Redirect es la directiva que especifica redirigir la petición y la acompañamos con los códigos de estado, estos si bien generalmente los pasamos de largo son bastante importantes teniendo cada uno un significado particular y es buena cosa conocerlos, aunque parezca que el resultado sea el mismo son fundamentales para que los navegadores puedan "comprender" el estado de un recurso, en este caso utilizamos uno de la serie 3xx que comprende las redirecciones, 301 significa que el recurso fue Movido permanentemente.
Luego colocamos la ruta del archivo original que ya no será accesible y separada la nueva dirección completa, es decir incluyendo el http://, el archivo se coloca en el directorio raíz o podemos incluirlo en el directorio específico donde se encuentre el archivo a excluir, lo importante es esté en nuestra ruta de búsqueda para que Apache lo tenga en cuenta (más adelante el porque es importante su ubicación).
Bien, ahora accedemos a http://localhost/Directorio/old_index.php y debemos ser redirigidos a http://localhost/Directorio/new_index.php, pero.... nada sucede, algo anda mal... y bueno, a prepararse para googlear un rato :)

El tema es que algunas de estas directivas hacen uso de funcionalidades de módulos de Apache, por lo que tenemos que verificar también que el módulo este primero disponible, y segundo, habilitado. En este caso es el llamado mod_alias, que viene incluido por defecto en Apache, así que a verificar si lo tenemos habilitado, en Ubuntu tipeamos en la terminal:

a2enmod alias

este comando y su contrapartida a2dismod son para habilitar (en-abled)  o desahabiliar (dis-abled) módulos, obtenemos:

Module alias already enabled

significa que ya lo tenemos y está habilitado, bien, no es problema  de módulos, que más verifico?
Lo siguiente a tener en cuenta son los archivo de configuración de Apache, supuestamente el httpd.conf pero en mi caso esta en blanco así que los buscamos en el directorio sites-enabled (en Ubuntu bajo /etc/apache2/sites-enabled), esta estructura es similar a la de módulos, los disponibles en mods-available y los activos en mods-enabled. En este caso tenemos los sites-available y los sites-enabled (son simplemente links), vamos a este último ya que posee los específicamente habilitados. En mi caso solo tengo un sito habilitado pero este archivo varía de una instalación a otra, buscamos algo como:

 
<Directory /var/www/>
  AllowOverride none
  Order allow,deny
  allow from all
</Directory>

Aquí esta el culpable, entre todas las opciones disponibles tenemos la infame AllowOverride, según la documentación "AllowOverride controls what directives may be placed in .htaccess files.", observamos que tiene un rotundo None, ahora sí, de ahí que no funcione el .htaccess que colocamos, lo sustituimos por un "All" y reiniciamos el servidor. Efectivamente ahora sí las peticiones son redirigidas a la nueva ruta, si examinamos el request con Firebug o similares vemos:

  Request URL:http://localhost/Directorio/
  Request Method:GET
  Status Code:301 Moved Permanently

siendo redirigidos a la nueva ruta, hay que tener en cuenta que también podemos especificar que directorios queremos habilitar y no todo el sitio (como en mi caso <Directory /var/www/>) y de ahí la importancia de donde colocaremos el .htaccess, también para con None/All hay más opciones, ahi depende de cuanto queramos customizar el server. Es sencillo pero como decía hay que verificar un par de cosas en caso de que no ande, si luego de esta corta guía sigue sin funcionar prepárate para leer un rato más.



No hay comentarios: