Friendly URLs en IIS

Un problema que se presenta constantemente en mi trabajo es que los servidores son un caos total debido a una mala organización por parte de los programadores y administradores. Hace algún tiempo se me dió la tarea de rediseñar los sistemas que se encuentran en esos servidores y una de las soluciones que dí fue unificar varios sistemas que realizan la  misma tarea, pero con variaciones menores.

La idea es sencilla, usar un ruteador que identificará el la variación de la aplicación basándose en una URI. Esto es, por ejemplo, que la URI http://sitio1.com/documento/rojo imprimirá un documento en color rojo y la URI http://sitio1.com/documento/azul imprimirá el mismo documento en color azul.

El plan original era montar este sitio usando un servidor Apache corriendo bajo Linux y usar mod_rewrite para  redirigir todas las peticiones a un pequeño ruteador escrito en PHP, el cual decidiría que acción se realizara con la petición. Sin embargo, en algún momento se complicó la administración de los servidores pues el sitio en producción correrá en 3+ servidores tras 2 servidores proxy, lo cual nos traería nuevos problemas como la configuración y sincronía de servidores.

Afortunadamente los recursos de hardware no son un problema, así que decidimos migrar de servidores en Linux a servidores Windows con IIS pues Microsoft incorporó en su servidor soluciones que replican los cambios hechos en un servidor al resto de servidores.

La única complicació que hubo en el proceso fue que encontré poca documentación respecto a como configurar IIS para que permita manejar las URIs mediante código, por lo que realicé un proceso de prueba y error hasta que descrubrí una forma de implmementar la redirección.

Para esto lo primero que hay que hacer es habilitar la Redirección HTTP en IIS, esto lo podemos hacer desde la sección "Activar o desactivar características de Windows" en el Panel de control.

Ahora, desde el Administrador de IIS debemos elegir el directorio a partir del cual deseamos que se aplique la redirección, por ejemplo si queremos que la redirección aplique para http://misitio.com/proyecto1 pero no para http://misitio.com/proyecto2, debemos elegir el directorio del proyecto1 en el panel de Conexiones.

En la vista de Características Abrimos el módulo de Reescritura de URL y en el panel de acciones seleccionamos "Agregar regla", esto abrirá un diálogo preguntando que tipo de regla deseamos agregar; debemos seleccionar la opcion de nueva regla en blanco.

Algo que debemos tener presente es que cada una de las secciones en la vista para Agregar o Modificar una regla, se aplican de la parte superior a la parte inferior a como se muestran en pantalla. Esto es, que primero se aplica el grupo "Coincidir direccion URL", despues Condiciones, Variables de servidor y Acción sucesivamente.

La siguiente es una descripción de cada una de las secciones:
  • Coincidir direccion URL: Hace que se aplique la regla de reescritura cuando la URL cumple con un patrón. Si el patrón no se cumple, no se efectuará ninguna redireccion y la petición se procesará normalmente.
    • Direccion URL solicitada: Permite aplicar el patron normalmente o negarlo.
    • Usando: Permite elegir si la redirección se aplicará usando una expresión regular, comodines o una coincidencia exacta.
    • Patrón: El patron contra el cual se comparará la URL.
 En este caso, como quiero que todas las peticiones sean discriminadas por mi ruteador, seleccioné una coincidencia usando el patrón '*' usando comodines (ver imagen del post para referencia).
  • Condiciones: Permite aplicar condiciones que no dependen de la URL a la redireccion.
    • Agrupacion lógica: Permite elegir si queremos que se cumpla con todas las condiciones o con por lo menos una condición.
    • Tabla de condiciones: Aqui podemos agregar las condiciones que deseamos que se cumplan, podemos usar variables de servidor para un mejor resultado.
 Aqui agregé una condición que indica que se aplicará la redirección solo si la URL no apunta a un archivo (ver imagen del post para referencia).
  • Variables del servidor: Nos permite definir o modificar el valor de variables de servidor.
Como no necesito ninguna variable de servidor para mi redirección, dejé esta seccion vacia.
  • Acción: Aquí podemos elegir que es lo que pasará con nuestra peticion.
    • Tipo de accion: Que es lo que queremos hacer con la peticion, las opciones son 
      • Reescribir: Reescribe la peticion para que sea enviada a una URL diferente.
      • Redirigir : Redirige la peticion a una URL diferente (pero sin modificarla)
      • Anular: Ignora la petición
      • Respuesta personalizada: Envía una respuesta personalizada (incluyendo el código de estado)
      • Ninguna: No hace nada, es equivalente a deshabilitar la regla.
    • Detener el procesamiento de las reglas siguientes: Si agregamos mas de una regla de redirección hace que al aplicarse esta regla dejen de procesarse las restantes.
El tipo de acción que deseo aplicar es Reescibir, por que quiero que las peticiones sean tratadas como si se hubieran enviado al archivo de mi ruteador. Dejo habilitada la de anexar cadena de consulta para conservar que URI se solicitó originalmente.


Al aplicar esta regla de redirección todas las peticiones serán manejadas por mi archivo index.php permitiendome usar cualquier ruteador escrito para apache, en este caso yo elegí Klein por ser fácil de implementar.


Si solo buscas una solución para copiar y pegar en tu servidor, puedes copiar esta regla al segmento Rewrite en tu web.config