by
Roland Schumacher alias GENiALi
21. März 2010 -- 457
words -- 15228 mal gelesen
klaus_b@.net hat in letzter Zeit einiges an Verbesserungen für die BlogEngine.NET in seinem Blog diskutiert und auch Code veröffentlicht. Da ich auch BlogEngine.NET einsetze und auch selber schraube machte mich das natürlich hellhörig. Einmal ging es um XML-RPC API die nicht ganz korrekt implementiert sind und einmal um den Einsatz des Meta-Tag robots. Und das mit dem Meta-Tag fand ich ganz faszinierend. Das wollte ich unbedingt einbauen.
Im Hinblick auf “Geld verdienen” mit dem Blog macht die Aussage durchaus sinn. Und das werde ich testen. Ich will nicht die Übersichtsseiten oder die Archiv im Index der Suchmaschinen haben sondern die Postings. So wie es aussieht kann das mit dem Meta-Tag robots gesteuert werden.
Allerdings wollte ich nur eine Datei anpassen müssen und nicht jede die irgend wie speziell gesteuert werden soll. Zuerst dachte ich an eine Extension für BlogEngine.NET. Allerdings gibt es kein sinnvolles Event auf das man reagieren könnte. Sobald eine Seite geöffnet wurde, die nichts mit Postings zu tun hat, wird das Post.Serving Event nicht mehr ausgelöst. Es gäbe aber noch ein Page.Serving Event. Page ist die Basisklasse von BlogEngine.NET. Leider ist die Implementation von Page.Serving eine Leiche. Das Event wird nie ausgelöst. Schade.
Also, was hat jedes Theme von BlogEngine.NET als Basis? Die site.master. Die wird immer aufgerufen. Egal was geöffnet wird. Somit kann das mit dem Meta-Tag schön zentral an einer Stelle abgewickelt werden.
Viel Code habe ich von der klaus_b@.NET Lösung genommen.
protected void Page_Load(object sender, EventArgs e)
{
SetRobotsMetaTag(sender);
}
private void SetRobotsMetaTag(object sender)
{
Page page = ((MasterPage) sender).Page;
string[] noindexPages = new[] { "default.aspx", "archive.aspx", "contact.aspx", "search.aspx" };
//Per default soll alles indexiert und verfolgt werden.
string metaContent = "index, follow";
foreach (string noindex in noindexPages)
{
if (page.Request.Path.ToLower().IndexOf(noindex) > -1)
{
//Es gibt aber ausnahmen die nicht indexert werden sollen.
metaContent = "noindex, follow";
break;
}
}
HtmlMeta tag = null;
foreach (Control ctrl in page.Header.Controls)
{
if (ctrl is HtmlMeta
&& ((HtmlMeta)ctrl).Name.ToLowerInvariant() == "robots")
{
tag = (HtmlMeta)ctrl;
tag.Content = metaContent;
break;
}
}
if (tag == null)
{
var meta = new HtmlMeta();
meta.Name = "robots";
meta.Content = metaContent;
page.Header.Controls.Add(meta);
}
}
In Zeile 10 werden die Seiten definiert die nicht indexiert werden sollen. Alle anderen werden indexiert und verfolgt.
Wenn neue Seiten definiert werden können die zentral erfasst werden.
Was noch wichtig ist, nicht das man das robots Meta-Tag mehr als einmal im Code hat. In den Einstellungen des Blogs können im HTML Head-Section Infos erfasst werden die im Header des HTML angezeigt werden. Das nutze ich rege für diverse Meta-Tags. Dort müsste das robots Meta-Tag entfernt werden. Sonst kommt es mehr als einmal im HTML Code. Was dann ein Bot damit macht ist mir nicht klar. Nimmt er das erste oder das letzte? Also einfach raus.
