Rescribir URL en ASP:NET :URLRewrite

Un modulo HTTP es una clase que contiene código que se ejecuta cada vez que se crea una petición a una pagina de nuestra aplicación ASP:NET.Teniendo en cuenta esto vemos que estos módulos son perfectos para implementar funcionalidades como caching, authentication, administración de estados, reescritura url.

Como vimos en esta introducción, podríamos rescribir las URL's si quisiéremos, ahora ¿que ventaja tiene hacer esto ? bueno imagínate una URL como esta http://www.tusitio.com.ar/prductos.aspx?categoria=limpieza , Jakob Neilsen recomienda que las URLs elegidas deben :

      1. Ser cortas
      2. Fácil de recordarlas
      3. Visualizar la estructura del sitio
      4. Permitir al usuario navegar a través del sitio cortando partes de la URL

y algunas ventajas que nos ofrece son:

  • Manejar casos donde tengas que restructurar las paginas dentro de tu aplicación y quieras que las personas que tienen marcadas tus URL's mantengan un link permanente.
  • Mejorar las búsqueda por relevancia de las páginas del sitio con los motores de búsqueda como Google, Yahoo.La reescritura de URL a menudo pueden hacer más fácil integrar a las palabras clave más comunes en las URL

Como vemos la URL citada anteriormente no cumple ninguno de estos criterios.

Una mejor aproximación podría ser http://www.tusitio.com.ar/productos/limpieza, esta si es mas fácil de recordar y por ejemplo si cortáramos limpieza de la url mostraría una lista de todos los productos.

Bueno, hay varias formas de hacer esto, voy a mostrar la que a mi parecer es la mas simple y fácil para que cualquiera la pueda implementar.Vamos a utilizar un modulo HTTP que esta disponible en la web de forma gratuita: UrlRewriter.net



Este módulo permite declarar expresiones que se mapean con las url's de tu aplicación, están reglas se definen en el archivo de configuración web.config.Por ejemplo si usamos el modulo UrlRewriter.net para mapear un la pagina productos.aspx, lo único que hacemos es agregar estas líneas en el web.config:

<?xml version="1.0"?>
<configuration>
<configSections>
<section name="rewriter" requirePermission="false" type="Intelligencia.UrlRewriter.Configuration.
RewriterConfigurationSectionHandler, Intelligencia.UrlRewriter
"/>
</configSections>
<system.web>
<httpModules>
<add name="UrlRewriter"
type="Intelligencia.UrlRewriter.RewriterHttpModule, Intelligencia.UrlRewriter"/>
</httpModules>
<compilation debug="true"/></system.web>
<rewriter>
<rewrite url="~/productos/libros" to="~/productos.aspx?categoria=libros"/>
<rewrite url="~/productos/varios" to="~/productos.aspx?categoria=varios"/>
<rewrite url="~/productos/revistas" to="~/productos.aspx?categoria=revistas"/>
</rewriter>
</configuration>


Fácil no , con estás líneas el modulo se encarga de todo, aparte de esto también tiene la posibilidad de usar expresiones regulares, para evitar escribir código por cada url, el ejemplo anterior lo podríamos simplificar escribiendo una expresión para cualquier categoría:



<rewriter>
<rewrite url="~/productos/(.+)" to="~/productos.aspx?categoria=$1" />
</rewriter>


:Lo bueno de esta forma de realizar la reescritura es que no debemos configurar nada sobre el servidor web iis, al cual no solemos tener acceso, ya que la mayoría de las veces subimos nuestra aplicación sobre un hosting de terceros (por lo menos en mi caso).



Descargar Ejemplo


6 comentarios:

Unknown dijo...

Buen Post y buen blog. Ahora a seguir programando jaja (en PB).
Nos vemos

Unknown dijo...

Creo que hay un pequeño bug en el ReWriterURL:

Si añades un asp:Button a productos.aspx , al haces postback la pagina casca. Esto se debe al atributo accion del form.

Saludos,

Pd: una solucion sería sobreescribir el metodo RenderAtributes del form y hacer un remove del "atributo" accion.

stz dijo...

Perdón por la ignorancia... pero este método también serviría para ASP simple? Muchas gracias

Manuel dijo...

No es un bug en el módulo, el problema es el atributo action de la etiqueta form. Se reescribe y no debería.
Hay soluciones por la web añandiendo algo de código.
Suerte.

Unknown dijo...

Eh implementado el ejemplo... pero las url siguen igual!!.. no hay cambio.. no eh manejado link.. sino botones.. tampoco me sale error.. a ver si me echan una manita.. =).. Gracias

llvll3T4L F0R3V3R dijo...

Buenas noches _Sebastian, de antemano te felicito por publicar este tipo de contenidos, de verdad que ayudan mucho.

Tengo una cuenta de hosting en Dattatec, estoy tratando de implementar este pequeño ejemplo y me trunca, me sale el error 404 al marcar la URL http://misitio.com/productos/limpieza

utilicé este ejemplo ya que mencionaste que es independiente del iis al cual efectivamente no tenemos acceso. Pero que va, el host utiliza IIS 7.5 ¿crees que la versión de IIS tenga algo que ver? a lo cual lo dudo ya que si es "independiente" del mismo no debería marcar error.

Cualquier comentario que me puedas hacer te lo agradecería.

PD: En localhost me va de maravilla el ejemplo.

Saludos

 

©2009 _Sebastian | Template Blue by TNB