Si queremos tener url mas amigables, ya es algo que debemos forzarnos en toda app web, para el buscador que nos visita e indexa y para entender mejor nuestra app por parte del usuario.
Por una pregunta que me hicieron aquí detallo la forma que tenemos de realizar esta tarea utilizando el modulo de IIS (y además dejo para otros post de como sería con lo que tenemos desde la ASP.NET MVC y en Webforms desde la versión 4.0 que es el Enrutamiento/Routes)
Tenemos algunas alternativas (para incluso para Webforms…)
- El modulo del IIS Url Rewrite (el de este post)
Muy fácil y transparente para la app web… cualquiera sea no necesariamente ASP.NET
http://www.iis.net/downloads/microsoft/url-rewrite - También existen la posibilidad de redireccionar mediante HttpContext.RewritePath
(lo bueno que lo tenemos desde la versión de ASP.NET 2.0)
http://msdn.microsoft.com/es-es/library/system.web.httpcontext.rewritepath.aspx - Pero desde la versión de ASP.NET 4.0 tenemos el Enrutamiento/Routes (idem a los que utilizamos en MVC)
Veamos entonces el punto 1… el módulo IIS URL Rewrite
¿Qué necesitamos mapear?
Lo que se requiere es poder mapear por ejemplo esta URL (un poco extensa)
http://localhost/PruebaLandingVueloConParametros.aspx?Origen=santiago-SCL&Destino=buenosaires-BUE&FechaSalida=01_10_2013&FechaRegreso=05_12_2013&Adultos=3&Child=3
A algo mucho mas amigable
http://localhost/PruebaLandingVueloConParametros/santiago-SCL/buenosaires-BUE/01_10_2013/05_12_2013/3/4
Url Rewrite
El modulo de IIS URL Rewrite utiliza reglas para evaluar y mapear la URL del request a la url que definimos, antes de ser procesado por un servidor web IIS.
Pero es mucho mas potente, incluso para utilizar en las reglas el encabezado HTTP y variables del servidor o para modificar url del response (sobre escribir la respuesta)
Aquí veremos la pregunta concreta, como reescribimos
Entonces:
- Descargar el modulo del IIS
- Definir una regla de reescritura para la url planteada
- Listo! (no hace falta hacer nada en la app web, ya que es transparente)
- ¿Dónde guarda el modulo las reglas? Web.config (podríamos escribir las reglas directamente allí)
1) Descargar el modulo del IIS
Tienes varios lugares donde obtenerlo… y todos lo hacen a través de Web Plataform Installer
- http://www.iis.net/downloads/microsoft/url-rewrite
- http://www.microsoft.com/web/spotlight/urlrewriter/
Que apuntan a la pagina de instalación de Web Plataform Installer
http://www.microsoft.com/web/gallery/install.aspx?appid=urlrewrite2
O directamente en nuestro IIS
Y dependiendo del idioma que hayamos descargo o tengamos configurado nuestro sistema operativo
Y allí realizas los pasos para agregar, e instalar directamente en el IIS. Esto deja listo para utilizarlo.
2) Definir una regla de reescritura para la url planteada
Las reglas de entrada básicamente tiene tres componentes
- Coincidencia de la cadena/Patrón: Hacer coincidir la cadena de dirección url.
Se pueden utilizar expresiones regulares o wildard (que es comodín que se utiliza en el modulo de Redirección HTTP del IIS). En ejemplo utilizamos expresiones regulares - Condiciones: Si se machea el patrón entonces se verifican las condiciones (pero pueden no tener condiciones) por ejemplo verificar si existe o no el archivo físico o directorio o alguna variable de servidor o encabezado HTTP
- Acción a tomar: Lo que se debe realizar si la cadena machea con el patrón de entrada y cumple las condiciones (podremos reescribir la url, definir una redirección – Response 3xx, abortar le petición o una respuesta personalizada)
Importante/A tener en cuenta
- Todas las reglas que agregamos se alojan en el web.config de la app que estamos manipulando
- Las url originales quedan guardadas en una variable de servidor (HTTP_X_ORIGINAL_URL y UNENCODED_URL)
- Las reglas se evalúan como se ingresan por esa razón se debe tener cuidado en las definición de las mismas (mirar en el web.config el orden se puede manipular allí o desde la interfaz de administración podremos ordenar de otra manera)
Entonces comencemos a armar nuestra Reescritura de la url
Agregamos mediante la interfaz que nos proporciona desde el administrador del IIS una regla en blanco…
La url que queremos mapear era
http://localhost/PruebaLandingVueloConParametros.aspx?Origen=santiago-SCL&Destino=buenosaires-BUE&FechaSalida=01_10_2013&FechaRegreso=05_12_2013&Adultos=3&Child=3
A esto
http://localhost/PruebaLandingVueloConParametros/santiago-SCL/buenosaires-BUE/01_10_2013/05_12_2013/3/4
El Patrón para la url a mapear seria
^PruebaLandingVueloConParametros/([_0-9a-z-]+)/([_0-9a-z-]+)/([_0-9]+)/([_0-9]+)/([0-9]+)/([0-9]+)$
NOTA: A modo de ejemplo utilizo un patrón sencillo, pero la parte de origen y destino fechas podría ser algo mas “ajustado”, por ejemplo:
- Para la parte origen destino: ([a-z0-9]+-[a-z0-9]{3})
- Para la parte de fechas: ([0-9]{2}_[0-9]{2}_[0-9]{4})
Podremos probar el patrón…
- Datos de entrada para probar
PruebaLandingVueloConParametros/santiago-SCL/buenosaires-BUE/01_10_2013/05_12_2013/3/4 - Patron: Expresión Regular
^PruebaLandingVueloConParametros/([_0-9a-z-]+)/([_0-9a-z-]+)/([_0-9]+)/([_0-9]+)/([0-9]+)/([0-9]+)$
Como vemos en los resultados de la prueba tenemos grupo de captura de las referencias inversa, los {R:x} que nos ayudaran en la acción a tomar para entregar a la aplicación el parámetro correcto con el valor y nombre correctos.
¿Como capturamos los Back-references (referencia inversa)?
En este ejemplo en particular cada vez que utilizamos expresiones regulares (e.r) y agrupamos dichas expresiones en paréntesis (e.r) podremos capturar un “grupo de captura”.
Si este grupo esta en:
- Las condiciones entonces debemos hacer referencia a {C:x}
- En los patrones o reglas de entrada entonces {R:x}, como lo demuestra en la prueba de entrada del patrón
En este ejemplo en particular no tendremos en cuenta las condiciones, así que vamos directamente a la acción a tomar…
Accionar a Tomar: Reescritura
Donde tendremos la dirección url a reescribir tomando las referencia inversas del patrón de entrada (los {R:x})
PruebaLandingVueloConParametros.aspx?origen={R:1}&destino={R:2}&fechaSalida={R:3}&fechaRegreso={R:4}&adultos={R:5}&child={R:6}
Nos quedaría así:
Donde vemos
- Destildar “Anexar cadena de consulta (querystring)” asi queda limpio la rescritura y no necesitaremos nada mas (aqui deberias evaluar si debes o no agregar el querystring en la acccion)
- Destildar si queremos no “Dirección Url reescrita de registro” o sea logear en los logs del IIS la url reescritra
- Y debemos tildar “Detener el procesamiento de las reglas siguientes”, para que no se evaluen las demas reglas
3) Listo! (no hace falta hacer nada en la app web, ya que es transparente)
Y en nuestra app? Sigue funcionando porque esto lo realiza el IIS independientemente de la app o tecnología que esta sirviendo (ASP.NET, PHP, etc)
Así que nuestro código no tiene cambio! Puedes utilizarlo tranquilamente…
4) ¿Donde guarda el modulo las reglas? Web.config
Esto nos queda en el web.config por supuesto dentro de la seccion <system.webServer><rewrite>…
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<system.webServer>
<rewrite>
<rules>
<rule name="LandingVuelo" stopProcessing="true">
<match url="^PruebaLandingVueloConParametros/([_0-9a-z-]+)/([_0-9a-z-]+)
/([_0-9]+)/([_0-9]+)/([0-9]+)/([0-9]+)$" />
<action type="Rewrite"
url="PruebaLandingVueloConParametros.aspx?origen={R:1}&destino={R:2}&
fechaSalida={R:3}&fechaRegreso={R:4}&adultos={R:5}&child={R:6}"
appendQueryString="false" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
NOTA: A modo de visualización en este articulo las urls tiene un salto de línea (algo que no puede tener en el web.config)
Podríamos escribir las reglas directamente allí, algo que hacemos mas rápido (y nos gusta tocar XML)
Espero que les sirva de ayuda o guía.
Como en el anterior post de esta temática sobre utilizar el modulo de IIS Url Rewrite… Aquí dejo las