Archivo para 1 noviembre, 2008

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://&#8221; + HttpContext.Current.Request.ServerVariables[“SERVER_NAME”];

            // cuando ocurre un error 401, en ‘querystring’ tenemos: “401;http://servidor.com/lapaginasolicitada&#8221;
            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 🙂