BlogEngine.net: come rimuovere la data dall’URL dei post

Alcuni giorni fa ho preso inconsciamente la decisione di rimuovere le date dall’URL dei post nel mio sito sviluppato su piattaforma BlogEngine.net, un CMS open source in Asp.net.

La funzionalità disponibile su Impostazioni, nella sezione Altre Impostazioni, consente di aggiungere o rimuovere le date dagli URL dei post semplicemente mettendo o togliendo la spunta alla voce Aggiungi la data al collegamento del Post.

Purtroppo per me questa operazione di rimozione ha causato un impatto negativo e seri danni lato SEO ad Informarea.

Come rimuovere la data dall’URL dei post

Come rimuovere le date dall'URL dei post in asp.net

Mentre WordPress gestisce l’eliminazione della data dall’URL dei post con diversi plugin, BlogEngine non prevede una funzione ad hoc che aiuti l’utente a risolvere tale problematica, e questo crea un certo fastidio ai motori di ricerca come Google, che interpretano i tuoi articoli come articoli duplicati, anche se hai fornito una sitemap valida e con nuovi URL. A tal proposito dai un’occhiata in Search Google nella sezione Aspetto nella ricerca > Miglioramento HTML > Meta Tag Title duplicati, per visualizzare che i post duplicati sono proprio quelli con data e senza data. Ad esempio una cosa del genere:

Come scrivere sulla tastiera del PC senza guardare
/post/2016/05/14/come-scrivere-sulla-tastiera-del-pc-senza-guardare.aspx
/post/2016/05/14/come-scrivere-sulla-tastiera-del-pc-senza-guardare

Questa situazione ha provocato una perdita di posizionamento dei miei articoli nei motori di ricerca ed un evidente calo di visite giornaliere. Nel frattempo ho provato a cercare su Internet la soluzione a tale problematica e cioè come rimuovere le date dall’URL dei post in Asp.net o C# e come effettuare un redirect 301 permanente. Ma niente di niente. Quindi?

Ecco come ho risolto in BlogEngine.net:

  • Effettuato il download dell’ultima versione di Visual Studio nella versione gratuita
  • Effettuato il download del file BlogEngine.net (source) della versione che stai utilizzando.
  • Aperto la versione BlogEngine.sln in Source/Blogengine
  • In Esplora Soluzioni di Visual Studio aperto BlogEngine.Core > Web > UrlRules.cs

In questo file ho aggiunto le seguenti righe di codice:

Nella #region Constants and Fields della classe UrlRules

private static readonly Regex YearMonthDayRegexs = new Regex("/([0-9][0-9][0-9][0-9])/([0-1][0-9])/([0-3][0-9])/", RegexOptions.IgnoreCase | RegexOptions.Compiled);

 

Nel metodo ExtractTitle, che riceve come secondo parametro la url dei post, devi scrivere le seguenti righe di codice all’interno subito dopo questa riga di codice

 url = url.ToLowerInvariant().Replace(“—“, “-“);

 

if (url.Contains("/post/") || url.Contains("/POST/"))
{
if (YearMonthDayRegexs.IsMatch(url))
{
var match = YearMonthDayRegexs.Match(url);
var year = match.Groups[1].Value;
var month = match.Groups[2].Value;
var day = match.Groups[3].Value;
url = url.ToLowerInvariant().Replace("/" + year.ToString(), "");
url = url.ToLowerInvariant().Replace("/" + month.ToString(), "");
url = url.ToLowerInvariant().Replace("/" + day.ToString(), "");
if (url.Contains("?"))
{
url = url.Substring(0, url.Length - 1);
}
context.Response.AppendHeader("location", url);
context.Response.StatusCode = 301;
}
}


Se però i tuoi post hanno un URL che termina con l’estensione .aspx dovrai spostare queste righe di codice subito dopo questa istruzione:

if (url.Contains(BlogConfig.FileExtension) && url.EndsWith("/"))
{
url = url.Substring(0, url.Length - 1);
context.Response.AppendHeader("location", url);
context.Response.StatusCode = 301;
}

 

In questo modo i tuoi vecchi articoli contenenti la data nella URL verranno reindirizzati in un URL senza data, proprio come nell’esempio qui sotto:

  • da: /post/2013/10/11/come-trasferire-i-contatti-e-altri-dati-da-iphone-ad-android.aspx
  • a: /post/come-trasferire-i-contatti-e-altri-dati-da-iphone-ad-android

Al termine in Visual Studio, vai nel menu Compilazione e seleziona Ricompila BlogEngine.Core. Attendi il completamento dell’operazione, poi vai su Source\BlogEngine\BlogEngine.Core\bin\Release per copiare il file Blogengine.core.dll e incollarlo nella cartella Bin nella root del tuo sito. E il gioco è fatto!

Se non vuoi mettere mano al BlogEngine.Core, puoi provare ad intervenire nel Web.Config con queste righe di codice. Attenzione è da testare dato che non l’ho provato.

<system.webServer>
<rewrite>
<rules>
<rule name="remove year month day" stopProcessing="true">
<match url="^/([0-9]+)/([0-9]+)/([0-9]+)/([_0-9a-z-]+)$" />
<action type="Rewrite" url="/post/{R:4}" appendQueryString="true" />
</rule>
</rules>
</rewrite>
</system.webServer>

Detto questo devo fare un ringraziamento particolare a due grandi blogger che, con la loro disponibilità, mi hanno aiutato ad uscire da questa brutta situazione, e che ammiro e stimo veramente:

Luca Congiu: sviluppatore asp.net e blogger di DotNetCode.it e autore di alcuni articoli su Informarea.it

Giorgio Borelli: autore e ideatore del blog Informaticando.net – un intorno web sull’Informatica.

Fabrizio Cannatelli

Autore e Founder di Informarea, sono un appassionato di informatica e tecnologia da sempre. La voglia di comunicare e di condividere sul Web le mie curiosità e le mie conoscenze, mi ha spinto a lanciarmi nel progetto di questo sito. Nato un po' per gioco e un po' per passione, oggi è diventato una grande realtà.

Fabrizio Cannatelli

Approfondimenti