Añadir redirecciones 301 personalizadas en webforms utilizando un HttpModule

Hace poco tenía que eliminar algunas viejas páginas de uno de mis sitios web, pero quería mantener el peso y el ranking acumulado en los principales buscadores de páginas, indicándole a las arañas de los buscadores y a los propios visitantes que dichas páginas se habían movido de forma permanente.

El advenimiento de ASP.NET MVC me hizo más fácil el generar respuestas HTTP personalizadas para los recursos específicos de un sitio web sin tener que recurrir a la escritura de módulos y controladores personalizados para llevar a cabo estas acciones personalizadas. Si estás buscando poner en práctica este tipo de funcionalidad en un webform tradicional, sigue leyendo.

Tenemos 2 partes en esta práctica. La primera es la creación de una sección para la configuración personalizada dentro del Web.config, donde almacenaremos las asignaciones de URL y en la segunda parte, utilizaremos un HttpModule para realizar la redirección. Vamos a empezar por echar un vistazo dentro del archivo Web.config.

<configuration>
  <configSections>
    <section name="redirectMapSection" type="SmileyCreations.Library.Configuration.RedirectMapSection, SmileyCreations.Library"/>
  </configSections>
  <system.web>
    <httpModules>
      <add name="RedirectModule" type="SmileyCreations.Library.RedirectModule, SmileyCreations.Library"/>
    </httpModules>
  </system.web>
  <system.webServer>
    <modules>
      <add name="RedirectModule" type="SmileyCreations.Library.RedirectModule, SmileyCreations.Library"/>
    </modules>
  </system.webServer>
  <redirectMapSection>
    <redirectMappings>
      <add oldUrl="/portfolio/news_cms.aspx" newUrl="/portfolio" />
      <add oldUrl="/portfolio/enquiry_manager.aspx" newUrl="/portfolio" />
      <add oldUrl="/cv.asp" newUrl="/cv.aspx" />
      <add oldUrl="/popup.asp" newUrl="/" />
    </redirectMappings>
  </redirectMapSection>
</configuration>

Las cosas importantes a tener en cuenta aquí es que existe una entrada que define nuestro controlador personalizado (al cual vamos a llegar en un momento) en tanto system.Web y en system.webServer. Esto es simplemente para cubrir las dos bases en caso de que la aplicación se implemente en un servidor que ejecute IIS 7 en modo integrado (sección system.webServer) o en modo clásico IIS6 / IIS7 (sección system.Web).

Ahora que tenemos nuestra configuración definida en el archivo Web.config, vamos a echar un vistazo al código. En primer lugar el código de configuración:

public class RedirectMapSection : ConfigurationSection
{
  [ConfigurationProperty("redirectMappings")]
  public RedirectMappings RedirectMappings
  {
    get { return this["redirectMappings"] as RedirectMappings; }
  }

  public static RedirectMapSection GetConfig()
  {
    return ConfigurationManager.GetSection("redirectMapSection") as RedirectMapSection;
  }
}

public class RedirectMappings : ConfigurationElementCollection
{
  public Map this[int index]
  {
    get { return this.BaseGet(index) as Map; }
    set
    {
      if (this.BaseGet(index) != null)
      {
        this.BaseRemoveAt(index);
      }

      base.BaseAdd(index, value);
    }
  }

  protected override ConfigurationElement CreateNewElement()
  {
    return new Map();
  }

  protected override object GetElementKey(ConfigurationElement element)
  {
    return ((Map) element).OldUrl;
  }
}

public class Map : ConfigurationElement
{
  [ConfigurationProperty("oldUrl", DefaultValue = "", IsRequired = false)]
  public string OldUrl
  {
    get { return this["oldUrl"].ToString(); }
    set { this["oldUrl"] = value; }
  }

  [ConfigurationProperty("newUrl", DefaultValue = "", IsRequired = false)]
  public string NewUrl
  {
    get { return this["newUrl"].ToString(); }
    set { this["newUrl"] = value; }
  }
}

Y, por último, el propio módulo que hace todo el trabajo. Si la URL actual que se solicita coincide con una URL en el archivo de configuración, el módulo envía una cabecera http 301 (movido permanentemente) y establece la ubicación de la nueva url:

public class RedirectModule : IHttpModule
{
  public void Init(HttpApplication context)
  {
    context.BeginRequest += BeginContextRequest;
  }

  public void Dispose() { }

  private static void BeginContextRequest(object sender, EventArgs e)
  {
    var application = (HttpApplication) sender;
    var request = application.Request;
    var response = application.Response;
    var incomingUrl = request.RawUrl;
    var mappings = RedirectMapSection.GetConfig().RedirectMappings;
    foreach (Map mapping in mappings)
    {
      var oldUrl = mapping.OldUrl;
      var newUrl = mapping.NewUrl;
      if (oldUrl != incomingUrl) continue;
      response.Status = "301 Moved Permanently";
      response.AddHeader("Location", newUrl);
    }
  }
}

Y este ha sido el artículo en el que trataba explicaros cómo añadir redirecciones 301 personalizadas en webforms utilizando un HttpModule, esperamos que te haya gustado y sepas aplicarlo en tus futuros proyectos. Ya sabes que si nos quieres proponer un tema que quieres ver reflejado como un tutorial o como una práctica, solo tienes que hacer uso del área de comentarios de un poco más abajo. Por el contrario, si quieres enviarnos tus propios tutoriales, puedes hacerlo a través de la intranet de usuarios que está habilitada para ello, a través del menú Enviar Tutorial. Ya sabes, ayúdanos a crecer con tus conocimientos. ¡Un saludo y feliz código!

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP