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
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
- Effettuare il log delle chiamate a function di GPT in ASP.NET Web API
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- Utilizzare il metodo CountBy di LINQ per semplificare raggruppamenti e i conteggi
- Creare una libreria CSS universale: Cards
- Eseguire script pre e post esecuzione di un workflow di GitHub