<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>SEO.NET</title>
        <link>http://www.kowitz.net/category/16.aspx</link>
        <description>SEO.NET</description>
        <language>en-AU</language>
        <copyright>Brendan Kowitz</copyright>
        <managingEditor>brendan@kowitz.net</managingEditor>
        <generator>Subtext Version 2.0.0.43</generator>
        <item>
            <title>Graffiti Cms by Telligent</title>
            <link>http://kowitz.net/archive/2008/02/21/graffiti-cms-by-telligent.aspx</link>
            <description>&lt;p&gt;There are a fair few CMS solutions floating around in .NET at the moment, a good general comparison tool can be found at &lt;a href="http://www.cmsmatrix.org/"&gt;CmsMatrix.org&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cuyahoga&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In the past, the &lt;a target="_blank" href="http://www.cuyahoga-project.org/"&gt;Cuyahoga Website Framework&lt;/a&gt; has looked always fairly interesting, it is also built on &lt;a target="_blank" href="http://www.nhibernate.org/"&gt;NHibernate&lt;/a&gt; which to me is a plus. Most things I've done with NHibernate have generally "just worked", maybe it's because NHibernate development is pounded with unit tests, whatever it is, it works.&lt;/p&gt;
&lt;p&gt;I haven't had any experience developing any extensions for Cuyahoga, so I don't know exactly how extensible it is yet. In terms of usability, I did find the interface a little confusing at first. The admin section is only used to configure modules/pages..etc.. but to actually edit the content I needed to visit the actual page in admin mode and click edit module (DNN Style).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Graffiti&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://graffiticms.com"&gt;Graffiti CMS&lt;/a&gt; has only recently come to my attention. I remember only in the later half of last year reading about &lt;a target="_blank" href="http://telligent.com/"&gt;Telligent&lt;/a&gt; acquiring Dozing Dogs CMS and wondering at the time, what they were going to do with it, well, now days, there is no sign of Dozing Dogs. Instead, earlier this week Telligent released Graffiti CMS which appears to be completely new as a full version 1.0.&lt;/p&gt;
&lt;p&gt;Graffiti supports a variety of databases including VistaDB (default), MS Sql and MySql. Not only that, but they claim its mono-compatible, so it is able to be run on linux and other mono supported platforms.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Test Run of Graffiti&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Setup was really simple, xcopy, run. With not much more thought then that, your away. &lt;/p&gt;
&lt;p&gt;The dashboard of Graffiti looks fantastic. I've always been a fan of having an area dedicated to admin tasks, as opposed to having admin controls stuffed into a site's design, as done by DNN. The only thing that wasn't obvious in Graffiti is the fact that there are no "pages". All content appears to be considered a "post". The "posts" are configurable in a way that is easy to set them up in a blog style behavior, or leave them detached, essentially making them pages.&lt;/p&gt;
&lt;p&gt;Some of the highlights that stood out to me immediately&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Seems to use NVelocity templates to render out HTML, meaning it's lean and clean &lt;/li&gt;
    &lt;li&gt;Supports a programmable API -- MetaWeblog &lt;/li&gt;
    &lt;li&gt;Supports its own extensibility though Widgets &lt;/li&gt;
    &lt;li&gt;Widgets can be installed in literally 2 clicks &lt;/li&gt;
    &lt;li&gt;Admin dashboard is slick &lt;/li&gt;
    &lt;li&gt;Free express version &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Again, from observation, there are a couple of cons too&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;"Posts" appear to be rendered out into files on the disk, (like MovableType) this certainly got people that owned large blogs into trouble. &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a rel="lightbox" href="http://kowitz.net/images/kowitz_net/WindowsLiveWriter/GraffitiCmsbyTelligent_137A9/image_4.png"&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="248" alt="Graffiti Dashboard" width="496" border="0" src="http://kowitz.net/images/kowitz_net/WindowsLiveWriter/GraffitiCmsbyTelligent_137A9/image_thumb_1.png" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;I did get the feeling that I'd seen an admin area that looked similar...Graffiti even has fading panels at the top of the screen when you make a change...&lt;/p&gt;
&lt;p&gt;&lt;a rel="lightbox" href="http://kowitz.net/images/kowitz_net/WindowsLiveWriter/GraffitiCmsbyTelligent_137A9/image_6.png"&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="216" alt="Wordpress Dashboard" width="499" border="0" src="http://kowitz.net/images/kowitz_net/WindowsLiveWriter/GraffitiCmsbyTelligent_137A9/image_thumb_2.png" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;In any case, Graffiti seems like something that should be watched in future. It may already be a great solution for a small - medium site. I do think that a site with a lot of pages may become a little unwieldy in the current interface, especially if changes need to be made across many pages, or you want to switch to a new theme. &lt;/p&gt;&lt;img src="http://kowitz.net/aggbug/83.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Brendan Kowitz</dc:creator>
            <guid>http://kowitz.net/archive/2008/02/21/graffiti-cms-by-telligent.aspx</guid>
            <pubDate>Thu, 21 Feb 2008 12:16:05 GMT</pubDate>
            <wfw:comment>http://kowitz.net/comments/83.aspx</wfw:comment>
            <comments>http://kowitz.net/archive/2008/02/21/graffiti-cms-by-telligent.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://kowitz.net/comments/commentRss/83.aspx</wfw:commentRss>
            <trackback:ping>http://kowitz.net/services/trackbacks/83.aspx</trackback:ping>
        </item>
        <item>
            <title>A Free, FreeTextBox Alternative</title>
            <link>http://kowitz.net/archive/2007/02/21/a-free-freetextbox-alternative.aspx</link>
            <description>&lt;p&gt;I don't know why but &lt;a href="http://freetextbox.com/" target="_blank"&gt;FreeTextBox&lt;/a&gt; has just never cut it for me.  It's wonderful and easy to install and it comes as a nice control in a .NET assembly.  &lt;span style="font-weight: bold;"&gt;But &lt;/span&gt;it doesn't give you the nicest HTML back, in fact I'd go as far as to say, it mutates GOOD HTML you put in there yourself, this is bad.  Luckily there are some other free alternatives such as &lt;a href="http://tinymce.moxiecode.com/" target="_blank"&gt;TinyMCE&lt;/a&gt;, which is a nice little editor.  The only catch is it's pure javascript and requires a little manual intervention to work with your serverside code.&lt;br /&gt;
&lt;br /&gt;
On a side note: The guys over at &lt;a target="_blank" href="http://code.communityserver.org/?path=CS+Tree%5cCS+2.1%5cControls%5cEditor%5cITextEditor.cs"&gt;CommunityServer&lt;/a&gt; probably saw this problem and thought; no matter which editor you pick someone was going to complain, so they implemented the editor control in a Provider model. Clever.&lt;br /&gt;
&lt;br /&gt;
I'm not using CommunityServer so changing my little SUB editor still requires two lines of code change and a recompile, but the flavor of the week for me is &lt;a href="http://www.obout.com/editor_new/index.aspx" target="_blank" rel="nofollow"&gt;Obout's HTML Editor&lt;/a&gt;.  This little beauty is free for personal use, and commercial use requires only a small registration fee.&lt;br /&gt;
&lt;br /&gt;
This editor not only gives better HTML then FTB but also has some cool things like a Built-in spell checker, quick-formatting and bunches of other little options.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;UPDATE(29-Mar-07): &lt;/span&gt;I have now had a change to try out &lt;a target="_blank" href="http://www.fckeditor.net"&gt;FCKEditor&lt;/a&gt;, and it does seem to work very smoothly.  Also I did notice an option when using it under Mozilla to format 'span' tags rather then the out dated 'font' tags.&lt;/p&gt;
&lt;p&gt;It also appears that Obout may have changed their policy since I've made this post because I can no longer see any indication that they want anyone to use the editor for free, they seem to now be pushing downloading it as part of their new suite.  So in light of this, FCKEditor may be your best alternative.&lt;/p&gt;&lt;img src="http://kowitz.net/aggbug/67.aspx" width="1" height="1" /&gt;</description>
            <guid>http://kowitz.net/archive/2007/02/21/a-free-freetextbox-alternative.aspx</guid>
            <pubDate>Tue, 20 Feb 2007 23:57:36 GMT</pubDate>
            <wfw:comment>http://kowitz.net/comments/67.aspx</wfw:comment>
            <comments>http://kowitz.net/archive/2007/02/21/a-free-freetextbox-alternative.aspx#feedback</comments>
            <slash:comments>6</slash:comments>
            <wfw:commentRss>http://kowitz.net/comments/commentRss/67.aspx</wfw:commentRss>
            <trackback:ping>http://kowitz.net/services/trackbacks/67.aspx</trackback:ping>
        </item>
        <item>
            <title>Search Engine Optimization for .NET</title>
            <link>http://kowitz.net/archive/2006/12/17/search-engine-optimization-for-.net.aspx</link>
            <description>&lt;p&gt;&lt;strong&gt;Search Engine Bot Detection&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;So after I &lt;a href="http://www.kowitz.net/2006/12/7/Cleaning+Up+ASPNET+Sessions+in+Google.aspx"&gt;first noticed&lt;/a&gt; a large build up of strange session Urls in Google searches for my domain I've then done a little bit of &lt;a href="http://www.kowitz.net/2006/12/11/ASPNET+20+Mozilla+Browser+Detection+Hole.aspx"&gt;research&lt;/a&gt; into the issue and discovered it was .NET not detecting that the search engine spider was Mozilla/5.0 compliant and inserting some rubbish session id into the url. &lt;/p&gt;
&lt;p&gt;It's been nearly a week since my changes to correct this and there's already a small indication of the 'healing' process. The pages are not out of the index yet, (and yes I do know that I 'could' &lt;a href="http://services.google.com/urlconsole/controller"&gt;remove them manually&lt;/a&gt;) but there are a lot of urls, and I'm in no rush.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.kowitz.net/Attachment.ashx?id=WindowsLiveWriter%2fSearchEngineOptimizationfor.NET_FDE0%2fasp_net_url_cleanup%5b6%5d.jpg" rel="lightbox"&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="161" alt="ASP.NET Url Cleanup" width="240" src="http://www.kowitz.net/Attachment.ashx?id=WindowsLiveWriter%2fSearchEngineOptimizationfor.NET_FDE0%2fasp_net_url_cleanup_thumb%5b4%5d.jpg" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note on Webparts&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Another change I have made this week was completing stripping webparts out of my template. Now even though I think webparts are extremely cool...they render HTML Soup. So I'd probably recommend that if you have a site where you are trying to get it to rank via the content, don't use webparts. If its an admin section / personalisation portal / intranet site or any other scenario when content ranking is not important, then by all means, feel the &lt;strike&gt;soup&lt;/strike&gt; power!&lt;/p&gt;
&lt;p&gt;Apart from dropping 20k from my page here's another unexpected result:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.kowitz.net/Attachment.ashx?id=WindowsLiveWriter%2fSearchEngineOptimizationfor.NET_FDE0%2fthis_page_validates_as_xhtml_1_0_transitional%5b1%5d.jpg" rel="lightbox"&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="161" alt="Frontpage validates as XHTML 1.0 Transitional" width="240" src="http://www.kowitz.net/Attachment.ashx?id=WindowsLiveWriter%2fSearchEngineOptimizationfor.NET_FDE0%2fthis_page_validates_as_xhtml_1_0_transitional.jpg" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Yey I pass &lt;a href="http://validator.w3.org/"&gt;validation&lt;/a&gt; on W3C!!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Evil ViewState&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Well I think viewstate is fantastic, its a set-and-forget automagic keep-state for all things on your form. Only problem is it renders before the content. This is a bad thing because search phrases gain more significance the closer they are to the top of the document, so the idea is to keep the soup at the bottom. A bit of Googling shows there are &lt;a href="http://www.hanselman.com/blog/MovingViewStateToTheBottomOfThePage.aspx"&gt;various&lt;/a&gt; methods that have been implemented to move it to the bottom. The method I kind of agreed with (although I've lost the link d'oh) was where a basepage class simple overrides handling the viewstate and uses the LosFormatter to store it in the session. Now I only half agree with this, I like the idea of overriding the handling of the viewstate but not putting it in the session. I simply used this but added my own HiddenControl (i.e. __VIEWSTATE_SEO) to the bottom of the form on pre-render, easy.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;New Blog Category&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In respect of all these new things that appear to be common SEO problems I have created to new &lt;a href="http://www.kowitz.net/Posts/PostsByCategory.aspx?categoryId=1017"&gt;category&lt;/a&gt; for SEO.NET (Search Engine Optimisation for .NET) blog posts. And in addition to this I will be trying to starting a small toolkit of classes and resources that should be able to be applied to any ASP.NET 2.0 application to make it more SEO friendly.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Download&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Move ViewState to the bottom of the form &lt;a href="http://www.kowitz.net/files/BasePage.zip"&gt;BasePage.cs&lt;/a&gt; or view &lt;a href="http://www.kowitz.net/files/source/BasePage.cs.txt"&gt;Source&lt;/a&gt; online&lt;/p&gt;&lt;img src="http://kowitz.net/aggbug/65.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Brendan Kowitz</dc:creator>
            <guid>http://kowitz.net/archive/2006/12/17/search-engine-optimization-for-.net.aspx</guid>
            <pubDate>Sat, 16 Dec 2006 15:42:36 GMT</pubDate>
            <wfw:comment>http://kowitz.net/comments/65.aspx</wfw:comment>
            <comments>http://kowitz.net/archive/2006/12/17/search-engine-optimization-for-.net.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://kowitz.net/comments/commentRss/65.aspx</wfw:commentRss>
            <trackback:ping>http://kowitz.net/services/trackbacks/65.aspx</trackback:ping>
        </item>
        <item>
            <title>Cleaning Up ASP.NET Sessions in Google</title>
            <link>http://kowitz.net/archive/2006/12/06/cleaning-up-asp.net-sessions-in-google.aspx</link>
            <description>&lt;p&gt;&lt;strong&gt;ASP.NET and Dirty Urls&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;There are two things that have been bothering me about pages that are getting indexed in Google from an ASP.NET application. The first is somehow there are ASP.NET Session Urls ending up in the Google index. This is bad because searchers that actually do click these links are likely to get a 500 error (internal server error) because they will be trying to access a page of an expired session. &lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.kowitz.net/Attachment.ashx?id=WindowsLiveWriter%2fCleaningUpASP.NETSessionsinGoogle_6A92%2ferror_urls%5b10%5d.jpg" rel="lightbox"&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="184" alt="Indexed Session Urls in Google Sitemap tools" width="473" src="http://www.kowitz.net/Attachment.ashx?id=WindowsLiveWriter%2fCleaningUpASP.NETSessionsinGoogle_6A92%2ferror_urls_thumb%5b8%5d.jpg" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How is Google finding all these 'bad' urls?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Well apparently there is no browser definition in ASP.NET 2.0 for the Googlebot's useragent string, so when the spider hits your ASP.NET page it's browser capabilities are not defined.&lt;/p&gt;
&lt;p&gt;&lt;font color="#ff0000"&gt;Edit:&lt;/font&gt; The default browser capabilities are defined to &lt;strong&gt;&lt;font color="#000000"&gt;use cookies&lt;/font&gt;&lt;/strong&gt;, the issue occurs because the base Mozilla definition is defined to &lt;strong&gt;NOT&lt;/strong&gt; use cookies. If the browser is not able to accept cookeis .NET gets around this by inserting the session information into the Url and issues a 302 (content temporarily moved) in the response header. &lt;/p&gt;
&lt;p&gt;This default behaviour is a good and a bad thing. It's good in the fact that if I'm browsing an asp.net site on a pda that doesn't support cookies I still can. However just about every search engine spider ever created has it's own UserAgent string making it a tough task to issue the standard non-crufted url. One solution to fixing the session urls being indexed in Google is to tell your asp.net application that Googlebot supports cookies and the problem is solved. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;To read more about the solution please see my &lt;a href="http://www.kowitz.net/2006/12/11/ASPNET+20+Mozilla+Browser+Detection+Hole.aspx"&gt;next post&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dynamic Captcha build-up&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Another dynamic aspect that is used on this site are Captcha images, and yes Google's image spider finds those too. Upon trying a Google image search on my domain, it's littered with Captcha images! I've also added an exclude to the robots.txt file for this.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.kowitz.net/Attachment.ashx?id=WindowsLiveWriter%2fCleaningUpASP.NETSessionsinGoogle_6A92%2fcaptcha_buildup%5b2%5d.jpg" rel="lightbox"&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="305" alt="Captcha image build-up in Google image search" width="331" src="http://www.kowitz.net/Attachment.ashx?id=WindowsLiveWriter%2fCleaningUpASP.NETSessionsinGoogle_6A92%2fcaptcha_buildup_thumb.jpg" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Solution for Captcha images build-up and stop-gap solution for Session Urls&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Here is my "robots.txt" file so far for my SingleUserBlog install. *Note the last two lines, "Disallow: /(A(*" should exclude any ASP.NET session urls, (this is not recommended unless you have fixed the Mozilla detection hole). The last line should exclude any captcha images from being indexed.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;User-agent: *&lt;br /&gt;
Disallow: /LoginPage.aspx&lt;br /&gt;
Disallow: /Administration/&lt;br /&gt;
Disallow: /(A(*&lt;br /&gt;
Disallow: /Captcha.ashx*$&lt;/p&gt;
&lt;/blockquote&gt;&lt;img src="http://kowitz.net/aggbug/63.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Brendan Kowitz</dc:creator>
            <guid>http://kowitz.net/archive/2006/12/06/cleaning-up-asp.net-sessions-in-google.aspx</guid>
            <pubDate>Wed, 06 Dec 2006 13:49:27 GMT</pubDate>
            <wfw:comment>http://kowitz.net/comments/63.aspx</wfw:comment>
            <comments>http://kowitz.net/archive/2006/12/06/cleaning-up-asp.net-sessions-in-google.aspx#feedback</comments>
            <slash:comments>3</slash:comments>
            <wfw:commentRss>http://kowitz.net/comments/commentRss/63.aspx</wfw:commentRss>
            <trackback:ping>http://kowitz.net/services/trackbacks/63.aspx</trackback:ping>
        </item>
    </channel>
</rss>