Archivo de noviembre, 2008

Urls amigables, «friendly urls»

Posted in Programación with tags , , , on 25 noviembre, 2008 by febrer

Ya no esta de moda el utilizar urls del tipo: http://www.miportal.com/pagina.aspx?id=345, ahora lo «cool» es: http://www.miportal.com/mi-titulo-de-pagina-amigable.aspx (lo ideal seria omitir .aspx).

Para realizar este tipo de redirección, utilizo el siguiente método (basado en proceso de la petición en el BeginRequest, de la página):

Dispongo de un portal (desarrollado por mi), llamado FSPortal, que básicamente, lo que hace es almacenar todas las páginas estáticas en base de datos. Esto me posibilita que mediante un editor online (FckEditor), pueda dar a mis clientes la posibilidad de editar sus páginas online. Entre otros muchos parámetros, se puede dar un título «amigable» a las páginas. Esto, a parte de otras muchas ventajas, me permite realizar búsquedas en el contenido.

Para realizar la redirección, lo que hago es utilizar este sencillo método: http://www.codeproject.com/KB/aspnet/urlrewriter.aspx

Creando una regla del tipo:

<rule>
<url>(.*).aspx</url>
<rewrite>procesar.aspx?tit=$1</rewrite>
</rule>

De esta manera, proceso todos los nombres de url amigables, con la pagina procesar.aspx, que básicamente lo que hace es buscar en la base de datos una página con dicho titulo, y mostrándola.

Uno de los mayores problemas que tiene este sistema, es que no permite la utilización de páginas sin extensión. En este post hablo de como utilizar la redirección con páginas sin extensión, pero no es muy recomendable.

También existen otras alternativas de terceros como por ejemplo:

http://www.urlrewriting.net

http://www.isapirewrite.com

La pega de estas opciones, es que debes tener control total del servidor IIS para instalar dichos componentes.

Páginas sin extensión en servidores compartidos

Posted in Programación with tags , , on 1 noviembre, 2008 by febrer

Un gran problema, que seguro a más de uno le ha pasado, es el no poder utilizar páginas sin extensión en su proyecto web. Normalmente los proveedores de Internet, supongo que para curarse en salud, no permiten el uso de este tipo de funcionalidades en sus servidores, ya que requiere de la instalación de software de terceros, o simplemente por tocar lo menos posible los servidores.

Generalmente, si necesitas este tipo de funcionalidades, lo que hacen es recomendarte contratar un producto superior, como servidores dedicados.

Un ejemplo sería, en vez de utilizar:

http://www.tuportal.com/pagina.aspx?id=240&sec=12

Utilizar:

http://tuportal.com/titulo-de-mi-pagina

La solución «temporal» que yo he encontrado, de momento (hasta encontrar una más elegante), es utilizar el evento Application_BeginRequest del global.asax y comprobar el QueryString del objeto Request.

Para ello, lo primero que tenemos que hacer es modificar el web.config para que utilize «customErrors», de la siguiente forma:

<customErrors mode=»On» defaultRedirect=»nuestrapaginadeerror.aspx» />

De esta forma, cuando ocurra un error del tipo «Página no encontrada», es nuestra aplicación la que gestiona dicho error.

Despues, lo que tenemos que hacer es modificar el evento Application_BeginRequest, para que determine si ha ocurrido un error 401.

        public void Application_BeginRequest(object Sender, EventArgs e)
        {
            string path = HttpContext.Current.Request.Path; // en path estará la página nuestrapaginadeerror.aspx
            string queryString = HttpContext.Current.Server.UrlDecode(HttpContext.Current.Request.QueryString.ToString());
            string webHttp = «http://» + HttpContext.Current.Request.ServerVariables[«SERVER_NAME»];

            // cuando ocurre un error 401, en ‘querystring’ tenemos: «401;http://servidor.com/lapaginasolicitada»
            if (queryString.IndexOf(‘;’) != -1)
            {
                path = queryString.Split(‘;’)[1];
                path = path.Replace(webHttp, «»);

                HttpContext.Current.RewritePath(path);
            }
        }

Este mecanismo tiene una importante pega. La barra de direcciones es cambiada por el link original, es decir, se puede acceder con http://miportal.com/titulo, pero en la barra de direcciones, aparecerá http://miportal.com/pagina.aspx?id=34

 Quizá este matando moscas a cañonazos, pero si conoces alguna forma mejor, será bienvenida (no me vale poner un default.aspx en una carpeta 🙂