Urls sin extensión para sitios ASP.NET

Search Engine Optimization SEO
Hoy en día todos los sitios trabajan en optimizar lo más posible los sitios para hacerlos más amigables con los buscadores. A continuación les explicaré como lograr urls sin extensión en un sitio web desarrollado en ASP.NET. La parte de instalación del componente sobre el IIS también funciona para sitios en PHP o en otros lenguajes, siempre y cuando el servidor Web sea IIS. Un beneficio adicional que se puede lograr es el ocultar la tecnología sobre la cual está funcionando el sitio Web. Un ejemplo de url de este modo es: http://resultadodelaloteria.com/colombia/loteria-de-bogota

Prerequisito necesario:
Para poder realizar las adecuaciones mostradas en este post es necesario:

- Tener control sobre el servidor web donde se aloja el sitio Web el cual debe ser. Funciona sobre IIS 5.0 (Windows 2000), 5.1 (Windows XP), v6.0 (Windows Server 2003) y v7.0 (Vista + Windows Server 2008)

1. Descarga de Ionics Isapi Rewrite Filter
Es necesario descargar la dll que permitirá reescribir las Urls para que sean enviadas al servidor WEB. Luego de descargar el archivo se debe buscar la dll llamada IsapiRewrite4.dll

La dll normalmente se encuentra dentro de la carpeta lib. Adicionalmente encontrará ejemplos de los archivos .ini que permitirán configurar la redirección de urls.

2 Ejemplo de instalación sobre IIS 5.1
e IIS 6.0
2.1 Primero se debe guardar la URL en el servidor. Para nuestro ejemplo la hemos guardado en:
C:\WINDOWS\system32\inetsrv\IIRF\IsapiRewrite4.dll

2.2 Agregar un filtro ISAPI en las propiedades del sitio WEB dentro del IIS:

Imagen de IIS 5.1

Imagen de IIS 6.0
2.3 Colocar el filtro ISAPI agregado como primero de la lista (Esto en el caso de que posea más de uno)

Imágen de IIS 5.1

Imagen de IIS 6.0
2.4 Crear y guardar el archivo de configuración (.ini) en la misma carpeta donde se dejó IsapiRewrite4.dll. El archivo se debe llamar IsapiRewrite4.ini

Para el presente post se usó el siguiente, aunque puede encontrar más ejemplos en la carpeta descargada con el IsapiRewrite4:

# IsapiRewrite4.ini
#
# example ini file
#
# Tue, 12 Jun 2007 16:22
#

RewriteLogLevel 5

# This rule shows a simple replacement, expanding path elements in the URL to
# become parameters in a query string

RewriteRule ^/colombia/([^/.]+) /loteryResults.aspx?loteryName=$1
RewriteRule ^/colombia/ /country.aspx?idCountry=colombia


La primera reglas especificada indica que cualquier URL recibida con /colombia/* se redireccionará a la página /loteryResults.aspx?loteryName=*, donde el * indica cualquier caracter o conjunto de caracteres.

La segunda regla indica que si solamente se tiene la url como /colombia/ se redireccionará a la página /country.aspx?idCountry=colombia

3. Configuración del sitio Web para aceptar y mantener las URLs especificadas por el ini en el ISAPI.
Luego de realizar la configuración del ISAPI en el sitio Web si se inicia la aplicación funcionará, pero los action de los formularios aparecerán con las Urls con extensión. Esto es debido a que cuando asp.net procesa la url él en realidad procesa /loteryResults.aspx?loteryName=nombre y no tiene como identificar la verdadera url que le apareció al usuario o la que digitó (Esto lo oculta el filtro ISAPI). Para solucionar este problema se puede realizar lo siguiente:

3.1 Crear un archivo .browser dentro de nuestro sitio Web
Para hacer esto hacemos clic derecho sobre el sitio Web, luego elegimos la opción Add ASP.NET Folder y elegimos App_Browsers. Luego de esto creamos un nuevo Item de tipo Browser File.

Colocamos el siguiente código en nuestro archivo BrowserFile.browser

<browsers>
<browser refid="Default">
<controladapters>
<adapter controlType="System.Web.UI.HtmlControls.HtmlForm"
adapterType="FormRewriterControlAdapter" />
</controladapters>
</browser>
</browsers>

Este código permitirá que para todos los browsers se controlará el HtmlForm.

3.2 Crear una clase FormRewriterControlAdapter que se encargará de reescribir la url en el action de los formularios de las páginas Web. Esta clase es llamada automáticamente gracias a nuestro archivo .browser. El código es el siguiente:

using System.Web;
using System.Web.UI;
using System.Text.RegularExpressions;

public class FormRewriterControlAdapter : System.Web.UI.Adapters.ControlAdapter
{
protected override void Render(System.Web.UI.HtmlTextWriter writer)
{
base.Render(new RewriteFormHtmlTextWriter(writer));
}
}

public class RewriteFormHtmlTextWriter : HtmlTextWriter
{
public RewriteFormHtmlTextWriter(HtmlTextWriter writer)
: base(writer)
{
this.InnerWriter = writer.InnerWriter;
}

public RewriteFormHtmlTextWriter(System.IO.TextWriter writer)
: base(writer)
{
base.InnerWriter = writer;
}

public override void WriteAttribute(string name, string value, bool fEncode)
{
if ((name == "action"))
{
HttpContext Context;
Context = HttpContext.Current;
if (Context.Items["ActionAlreadyWritten"] == null)
{
//Logica para reacomodar los forms
if (Context.Request.RawUrl.Contains("/loteryResults.aspx?loteryName="))
{
value = "/colombia/" + Context.Request.RawUrl.Substring(Context.Request.RawUrl.IndexOf("/loteryResults.aspx?loteryName=") + 31);
}
else if (Context.Request.RawUrl.Contains("/country.aspx?idCountry="))
{
value = "/" + Context.Request.RawUrl.Substring(Context.Request.RawUrl.IndexOf("/country.aspx?idCountry=") + 24) + "/";
}
else
{
value = Context.Request.RawUrl;
}
Context.Items["ActionAlreadyWritten"] = true;
}
}
base.WriteAttribute(name, value, fEncode);
}
}

La finalidad del código de la función WriteAttribute es la de colocar el action de los formularios de tal manera que el usuario que está navegando en nuestro portal no se de cuenta cual es la página que atiene las solicitudes. En este caso, por ejemplo, si la url que recibe es /country.aspx?idCountry=colombia la función sobreescribira el código de action del form a /colombia/

Y eso es todo!. Esta implementación permite por ejemplo que solamente controlemos lo que queramos o las urls que deseemos y las demás urls, como por ejemplo css, js, imagenes y htmls seguirán funcionando siendo atendidos directamente por el IIS. Para esto debemos tener en cuenta que las urls de estos tipos de archivos no deben cumplir con las reglas que se colocan en el archivo IsapiRewrite4.ini

Comentarios

Entradas populares de este blog

Habilitar Ping Firewall Windows 2008

Instalar programa como servicio Windows

Ejecutar programa como servicio windows server 2008