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)

  • <a href="http://www.seowriter.ru/2008/01/21/stilnye-ikonky-rss/">%5B…]DeveloperGuru учит правильной оптимизации тегов в BlogEngine.net[…]</a>

  • Теги настраивать мне еще рано…однако спасибо за наводку ан сам движок, походу это лучшая альтернатива вордпрессу :)

  • Если ты не ASP.NET программист, то ставить BlogEngine.NET смысла нет. Для меня он хорош тем, что я могу дописывать нужную функциональность без изучения PHP.

  • Привет!

    Спасибо большое за пост.
    Я сам ASP.NET программист, поэтому хочу поставить себе BlogEngine.NET.
    Пока что установил его локально и думаю справиться ли он с моими требованиями.
    Главное, чтобы русский язык поддерживал.

    Я вижу, что у тебя URL с русским заголовком поста отображается хорошо, а у меня он создает такого вида:
    /post/d09fd180d0b8d0b2d0b5d182!.aspx

    Не знаешь как это побороть?
    Я могу конечно и сам начать разбираться, но просто наверняка наши люди уже это сделали и может быть есть готовое решение. :)

    И вообще, может ты знаешь какие-то русско язычные ресурсы по оптимизации BlogEngine.NET?

    Спасибо!

  • Admin

    По поводу URL: там надо в паре мест подправить, чтобы он русские буквы не энкодил. Где именно, сейчас уже не скажу, т.к. я давно это пофиксил и уже забыл.

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

    Русско язычные ресурсы по оптимизации BlogEngine.NET не подскажу, да и врядли что-то есть на эту тему, т.к. движок не очень популярный и, к тому же, очень простой. Я в нём за пару дней разобрался. Многие вещи под себя переделал.

  • Да, спасибо, я уже сам разобрался..
    На самом деле предпочел транслит вместо русских букв в названиях файлов.

    Да, у меня у самого блог на WordPress уже с год как. Удобно конечно что много плагинов есть и тем, но все равно дорабатывать приходилось, подтачивать для себя. И там довольно большая система, не без тормозов..

    А тут вроде на родном C# написано, не на PHP, всегда можно самому покопаться. :)

    Что еще переделал, если не секрет?

  • Admin

    Теги переделал, как описал в этой статье.
    А потом еще обратил внимание, что в облаке тегов почти все теги одного размера. Фишка в том, что реализован самый простой механизм: диапазон от минимального тега до максимального разбит на равные части.
    Например, есть 5 тегов и 5 размеров шрифта: тег1(4), тег2(9), тег3(12), тег4(20), тег5(200). В скобках указано количество постов. При таком раскладе первые четыре тега будут отображаться одним размером.
    Я сделал кластерный алгоритм, при котором каждый тег из примера получит свой размер шрифта.

    Базу немного поменял, т.к. сначала она была без связей ( http://devua.com/post/2007/12/blogengine-net-and-ms-sql-relational-database-provider.aspx ).

    Еще немного по мелочам.

  • А можно повзаимстовать этот алгоритм?

    Я пока пользуюсь XML вместо MS SQL. Какие преимущества использования базы, кроме скорости, когда твой блог станет побольше?

    Кстати, в твоем втором блоге (devua.com) невозможно оставить комментарий. 2 раза пробовал, не сохраняются. И еще если нажимаешь на название тэга, получаешь 404 ошибку.

  • Admin

    Алгоритм позаимствовать можно, но прямо сейчас не обещаю.

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

    По поводу ошибок на devua.com: спасибо, буду исправлять. Комментарии твои я получил по почте, но в блоге ничего нет. Странно.

  • Ну когда будет время конечно.
    Я подписался на твой RSS.

  • Кстати, тэги с пробелом посередине не правильно обрабатываются.
    Если потом кликаешь по этому тегу получаешь ошибку, что записей с таким тэгом не найдено…

  • А у тебя хостинг на 2008 сервере? Я прямо сейчас вожусь с этой проблемой, т.к. переношу один свой проект на другой хостинг и столкнулся с этим багом.

    На этом блоге у меня работает.

  • Геннадий

    Привет. У меня проблема. Ставлю на локальной машине Win XP + IIS 5.1 – все нормально работает. А заливаю на хостинг (Windows Server 2008 + IIS 7 наверное) – не хочет. Выдает 500 ошибку. Подскажите, если у Вас получилось. Спасибо

  • У меня все работает, в том числе на хостинге Windows Server 2008.
    Ошибка 500 без детализации?

  • Геннадий

    Вот страница с ошибкой http://error.comfoplace.com/500.htm

  • Pasha

    Геннадий
    а ты включи отладку через web.config и посмотри что за ошибка подробнее!!!