Home » Создание сайтов и программирование » Оптимизация тегов в BlogEngine.NET

Оптимизация тегов в BlogEngine.NET

В этом посте рассказывается об оптимизаци вида ссылок в облаке тегов в блоге на движке BlogEngine.NET. Поскольку пост получился немного длинный и интересен, в основном, только владельцам блогов на этом движке, остальной текст убран под cut.

Ссылки на теги в блогах на движке BlogEngine.NET имеют несколько несеошный вид: “/?tag=/имя_тега”. После того, как igorus акцентировал мое внимание на этом факте, я подумал, что не мешало бы этот недостаток исправить и привести ссылки на теги в следующий вид: “/tag/имя_тега.aspx”. С точки зрения поисковика такая ссылка является обыкновенной страницей сайта.

Приступим к реализации. Алгоритм очень простой: будем рерайтить все URL вида “/tag/имя_тега.aspx” на специальную страницу, которая и будет отображать необходимую информацию (в данном случае, список постов, помеченных соответствующим тегом).

Вот список действий, которые необходимо провести с исходными файлами BlogEngine.NET:

1. Скопируйте файлы tag.aspx и tag.aspx.cs в корень блога (см. в атачменте к посту).

Код этих файлов скопировани из default.aspx и default.aspx.cs. В принципе, можно было бы немного усовершенствовать default.*, но я решил, что так будет удобнее (в частности, будет проще апгрейдиться на следующую версию). Кроме этого, надо добавить в языковые ресурсы строку allpostswithtag – “Все посты с тегом” и “All posts tagged”.

2. В метод context_BeginRequest класса BlogEngine.Core.Web.HttpModules.UrlRewrite добавьте следующий код:

 

private void context_BeginRequest(object sender, EventArgs e)
{
HttpContext context = ((HttpApplication)sender).Context;
string url = context.Request.RawUrl.ToUpperInvariant();

if (url.Contains(BlogSettings.Instance.FileExtension.ToUpperInvariant()) && !url.Contains(“ERROR404.ASPX”))
{
// …
else if (url.Contains(“/AUTHOR/”))
{
string author = ExtractTitle(context);
context.RewritePath(Utils.RelativeWebRoot + “default” + BlogSettings.Instance.FileExtension + “?name=” + author + GetQueryString(context), false);
}

// Вставить этот код
else if (url.Contains(“/TAG/”))
{
RewriteTag(context);
}
// Конец вставки
}
}

 

 

 

И в любом месте этого же класса добавьте метод:

 

private static void RewriteTag(HttpContext context)
{
string url = context.Request.RawUrl;
int tagPosition = url.LastIndexOf(“/”) + 1;
string tag = url.Substring(tagPosition, url.LastIndexOf(“.aspx”) – tagPosition);

context.RewritePath(Utils.RelativeWebRoot + “tag.aspx?tag=/” + tag, false);
}

 

Теперь, блог будет обрабатывать наши ссылки. Осталось сделать так, чтобы они выводились в нужном нам виде.

3. В файле /App_Code/Controls/TagCloud.cs в методе RenderControl заменим строку

 

writer.Write(string.Format(LINK, Utils.RelativeWebRoot + “?tag=/” + HttpUtility.UrlEncode(key), WeightedList[key], “Tag: ” + key, key));

 

на

 

writer.Write(string.Format(LINK, Utils.RelativeWebRoot + “tag/” + HttpUtility.UrlEncode(key) + “.aspx”, WeightedList[key], Resources.labels.tag + “: ” + key, key));

 

Заодно, мы убрали жестко прописанную строку “Tag: ” на ссылку из ресурса Resources.labels.tag. Поэтому, надо добавить строку tag в файлы ресурсов (можно только в английскую и поддерживаемые языковые версии).

После этого, ссылки на теги в облаке выводится в нужном нам виде. Осталось поправить ссылки, выводимые в самих постах. Для этого, в классе BlogEngine.Core.Web.Controls.PostViewBase в методе TagLinks заменим

 

string link = “<a href=\”{0}/{1}\” rel=\”tag\”>{2}</a>”;
string path = Utils.RelativeWebRoot + “?tag=”;

 

на

 

string link = “<a href=\”{0}/{1}.aspx\” rel=\”tag\”>{2}</a>”;
string path = Utils.RelativeWebRoot + “tag”;

 

Теперь все готово! Можно запускать билд (не забудьте выбрать релизную версию) и выкладывать на хостинг.

Кстати, старые ссылки все еще работают, поэтому, если где-то на них есть внешние ссылки, то можно не беспокоиться. Впрочем, если ссылки, действительно, есть, то лучше настроить редирект на новые URL, чтобы не разделять вес страниц.

tag.zip (1,09 kb)