Route SEO per ASP.NET

di Daniele Bochicchio, in ASP.NET 4.0,

Quando si utilizza il routing di ASP.NET, le route di default vengono create senza lo slash finale, ma ovviamente le pagine restano comunque raggiungibili anche aggiungendolo. Questo discorso, in generale, può essere applicato a tutte le route senza estensione, utilizzate con ASP.NET 3.5 SP 1 o 4.0, o con ASP.NET MVC 1 e 2.

In simili scenari, per evitare una doppia indicizzazione sui motori di ricerca che penalizzi il ranking, è sufficiente optare per una delle due, facendo in modo che l'altra effettui un redirect permanente. In particolare, può essere necessario prevedere un HttpModule che intercetti le richieste, oppure, se si dispone dell'URLRewrite module di IIS 7.x, aggiungere una regola ad hoc.

Per fare in modo che l'indirizzo sia quello desiderato, occorre implementare una Route custom tramite cui generare correttamente il path:

public class SEOUrlRoute : Route
{
  public SEOUrlRoute(string url, IRouteHandler routeHandler)
    : base(url, routeHandler) { }
  public SEOUrlRoute(string url, RouteValueDictionary defaults,
                     IRouteHandler routeHandler)
    : base(url, defaults, routeHandler) { }
  public SEOUrlRoute(string url, RouteValueDictionary defaults, 
                     RouteValueDictionary constraints, IRouteHandler routeHandler)
    : base(url, defaults, constraints, routeHandler) { }
  public SEOUrlRoute(string url, RouteValueDictionary defaults, 
                     RouteValueDictionary constraints,
                     RouteValueDictionary dataTokens, IRouteHandler routeHandler)
    : base(url, defaults, constraints, dataTokens, routeHandler) { }

  public override VirtualPathData GetVirtualPath(RequestContext requestContext, 
                                                 RouteValueDictionary values)
  {
    VirtualPathData path = base.GetVirtualPath(requestContext, values);
    if (path != null)
    {
      int indexOfQueryString = path.VirtualPath.IndexOf("?");
      if (indexOfQueryString != -1)
      {
        path.VirtualPath = string.Concat(
              path.VirtualPath.Substring(0, indexOfQueryString),
              "/",
              path.VirtualPath.Substring(indexOfQueryString));
      }
      else
      {
        path.VirtualPath = string.Concat(
          path.VirtualPath, 
          string.IsNullOrEmpty(path.VirtualPath)?
          string.Empty: "/" );
      }
    }
    return path;
  }
}

La route appena creata, durante la fase di generazione, che avviene all'invocazione del metodo GetVirtualPath, provvederà ad aggiungere uno slash finale ove necessario, tenendo eventualmente conto della presenza di parametri in querystring.

Per semplificarne la registrazione, è opportuno creare un extension method che agirà per noi, creando la registrazione:

public static class Extensions
{
    public static void MapSEORoute(this RouteCollection routes, string name,
                                   string url, object defaults, object constraints = null)
    {
      if (routes == null)
        throw new ArgumentNullException("routes");

      if (url == null)
        throw new ArgumentNullException("url");

      var route = new SEOUrlRoute(url, new MvcRouteHandler())
      {
        Defaults = new RouteValueDictionary(defaults),
        Constraints = new RouteValueDictionary(constraints)
      };

      if (string.IsNullOrEmpty(name))
        routes.Add(route);
      else
        routes.Add(name, route);
    }
}

Grazie a quest'ultimo, per registrare le route personalizzate nel global.asax è sufficiente scrivere del codice simile al seguente:

protected void Application_Start()
{
  RouteTable.Routes.MapSEORoute(
      "MVCRoutes",
      "{controller}/{action}/{id}",
      new { controller = "Home", action = "Index", id = "" });
}

In questo modo diventa possibile controllare al 100% la generazione dell'URL, anche in presenza dei metodi aggiunti in ASP.NET 4.0 per controllare la generazione delle route da codice.

Per approfondimenti:
Le novità di ASP.NET 4.0
https://www.aspitalia.com/articoli/asp.net4/introduzione.aspx

#953 - Utilizzare le nuove funzionalità di URL Routing di ASP.NET 3.5 SP1
https://www.aspitalia.com/script/953/Utilizzare-Funzionalita-URL-Routing-ASP.NET-3.5-SP1.aspx

Per informazioni su URLRewrite module per IIS:
http://www.iis.net/download/URLRewrite

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi