В этом посте рассказывается об оптимизаци вида ссылок в облаке тегов в блоге на движке 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)
Понравился пост? Подпишись на RSS, чтобы не пропустить новые интересные материалы.