Is there an SEO in the house? Google and Live rankings need help.

I am not an SEO but thought we did a good job optimizing and submitting for the search engines.

We are very high on Yahoo and Alta Vista for "sharepoint" and "sharepoint search", but we have remained a PR0 on google for 4 months (thats 0/10, which is rock bottom) and Live won't even return us when you search on sharepointsearch.com.

How can you tell if you are being punished?

Do we seem like a link farm to the search engines?

note: sharepointsearch.blogspot.com (my original blog ) is extremely high on searches even though there is little content compared to my new blog. 

Any advice is appreciated.

UPDATE:  10/28/07   we are now pr3/10 on most google servers  http://oyoy.eu/google/pr/?url=http%3a%2f%2fsharepointsearch.com  so something we did fixed our issue.

 

Del.icio.us | Digg It | Technorati | Blinklist | Furl | reddit | DotNetKicks
Posted by notorioustech | with no comments
Filed under: ,

Google Ranking effected by Response.Redirect

It seems that search engines, like Google, frown on the 302 Redirect due to hijacking and that is the method that is the ASP.NET response.redirect uses.

That would also explain why our sites main page has yet to be issued a PR rating by google. We were doing a response.redirect from the default page to a page in our document library. In fact I have a posting earlier in the blog explaining how to do it - sorry.

The correct way to do a redirect for a permanent type of page like a root default page going to page library is:

  Response.Status = "301 Moved Permanently";
  Response.AddHeader("Location","http://sharepointsearch.com/pages/default.aspx");
  Response.End();

Now lets see how long it takes to get our pr rating.

 

UPDATE: 10/18

Our PR remains at 0/10. So trying something new.

 void Page_Init()
    {
        Server.Transfer("/pages/default.aspx");
 }

This will allow the http://sharepointsearch.com   to display the contents at /pages/default.aspx without doing any form of redirect. This kind of transfer will really only work well with a page that doesn't do any post backs and mostly links out, which our main page.

Del.icio.us | Digg It | Technorati | Blinklist | Furl | reddit | DotNetKicks
Posted by notorioustech | with no comments

Adding refer (digg, technorati ..) links to Community Server blogs

I needed a way to add the standard community referring links to blog posts in Community Server. I was surprised by how easy it actually was. So if you are using CommunityServer.org 2007 and want to do the same then follow these instructions.

1. create a c# project in visual studio and add this code below to a new class in the project. Fix the namespace of course.

using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using System.Web;
using CommunityServer.Blogs.Components;
using CommunityServer.Components;

namespace SPWorks.CS.Integration
{
    class SPWReferIt : ICSModule
    {
        private bool _syndicate = true;
        private bool _web = true;
        private DateTime _dateFilter = DateTime.MinValue;
        private string links = "";
        public void Init(CSApplication csa, XmlNode node)
        {
            csa.PreRenderPost += new CSPostEventHandler(csa_PreRenderPost);
            links = node.Attributes.GetNamedItem("ReferLinks").Value;
             if (links == null) links = "";
             links = Globals.UrlDecode(links);
        }
        private void csa_PreRenderPost(IContent content, CSPostEventArgs e)
        {
            if (e.Target == PostTarget.Web)
            {
                if (!_web)
                    return;
            }
            else if (e.Target == PostTarget.Syndication)
            {
                if (!_syndicate)
                    return;
            }
            if (e.ApplicationType == ApplicationType.Weblog)
            {
                WeblogPost wp = content as WeblogPost;
                bool includePost = (e.Target == PostTarget.Web || wp.PostDate >= _dateFilter);
                if (wp != null && wp.PostLevel == 1 && includePost)
                {
                    string link = Globals.FullPath(BlogUrls.Instance().Post(wp));
                    string title = wp.Subject;
                    if (title.Length > 150) title = title.Substring(0, 149);
                    string[] tags = wp.Categories;
                    string tagsstr = "";
                    if (tags != null)
                    {
                        for (int i = 0; i < tags.Length; i++)
                        {
                            if (tagsstr != "") tagsstr += " ";
                            tagsstr += tags[i];

                        }
                    }
                    string tagsEncode = Globals.UrlEncode(tagsstr);
                    string titleUrlEncode = Globals.UrlEncode(wp.Subject);
                    string linkEncode = Globals.UrlEncode(link);
                    string linksstr = links;
                    if (linksstr != "")
                    {
                        linksstr = "\n" + linksstr.Replace("[TAGS_ENCODED]", tagsEncode).Replace("[URL_ENCODED]", linkEncode).Replace("[TITLE_ENCODED]", titleUrlEncode).Replace("[TAGS]", tagsstr ).Replace("[URL]", link).Replace("[TITLE]", title);
                    }

                    wp.FormattedBody += linksstr; 
                                 }
            }
        }

    }
}

 

2. Add references to the CommunityServer blogs and components dlls to your project

3. Compile and put your dll in the bin directory of the CommunityServer web site.

4. Open the CommuntyServer.config file and make new entry for your module like so:

<add name = "SPWReferItModule" type = "SPWorks.CS.Integration.SPWReferIt,SPWorks.CS.Integration" ReferLinks="" />

5. In the step above the ReferLinks attribute is where you will put your html template for creating the links. In SHAREPOINTSearch's case we chose the follow URLs:

<a href="http://del.icio.us/post?url=[URL_ENCODED]&tags=[TAGS_ENCODED]&title=[TITLE_ENCODED]" mce_href="http://del.icio.us/post?url=[URL_ENCODED]&tags=[TAGS_ENCODED]&title=[TITLE_ENCODED]">Del.icio.us</a> | <a href="http://digg.com/submit?phase=2&url=[URL_ENCODED]&title=[TITLE_ENCODED]&tags=[TAGS_ENCODED]" mce_href="http://digg.com/submit?phase=2&url=[URL_ENCODED]&title=[TITLE_ENCODED]&tags=[TAGS_ENCODED]">Digg It</a> | <a href="http://technorati.com/cosmos/search.html?url=[URL_ENCODED]&tags=[TAGS_ENCODED]" mce_href="http://technorati.com/cosmos/search.html?url=[URL_ENCODED]&tags=[TAGS_ENCODED]">Technorati</a> | <a href="http://blinklist.com/index.php?Action=Blink/addblink.php&url=[URL_ENCODED]&Title=[TITLE_ENCODED]&tags=[TAGS_ENCODED]" mce_href="http://blinklist.com/index.php?Action=Blink/addblink.php&url=[URL_ENCODED]&Title=[TITLE_ENCODED]&tags=[TAGS_ENCODED]">Blinklist</a> | <a href="http://furl.net/storeIt.jsp?t=[TITLE_ENCODED]&u=[URL_ENCODED]&tags=[TAGS_ENCODED]" mce_href="http://furl.net/storeIt.jsp?t=[TITLE_ENCODED]&u=[URL_ENCODED]&tags=[TAGS_ENCODED]">Furl</a> | <a href="http://reddit.com/submit?url=[URL_ENCODED]&title=[TITLE_ENCODED]&tags=[TAGS_ENCODED]" mce_href="http://reddit.com/submit?url=[URL_ENCODED]&title=[TITLE_ENCODED]&tags=[TAGS_ENCODED]">reddit</a> | <a href="http://www.dotnetkicks.com/submit/?url=[URL_ENCODED]&title=[TITLE_ENCODED]&tags=[TAGS_ENCODED]" mce_href="http://www.dotnetkicks.com/submit/?url=[URL_ENCODED]&title=[TITLE_ENCODED]&tags=[TAGS_ENCODED]">DotNetKicks</a>

 NOTE: the replacement holders: [TITLE_ENCODE] [URL_ENCODE] [ TAGS_ENCODE] . these are pretty self explanatory and use these to add your own refer it links to the template. When you have the template ready. Then use http://www.albionresearch.com/misc/urlencode.php to URLEncode the whole string and paste it into the ReferLinks attribute. 

THAT's it. It took me exactly 35 minutes to write and should take you 10 to use.

You can try it out on this blog post itself. See:  

Del.icio.us | Digg It | Technorati | Blinklist | Furl | reddit | DotNetKicks

Site Template Tips - size matters

Sorry for resorting to the cheesy title but think it is worth it to get your attention. I spent quite awhile trying to figure this out so let me save you some time.

So you have a large customized site that you want to reuse as a template to create new sites and you find there are some barriers to this.

First barrier:

The maximum size that a list or site can be saved as a template is suppose to be 10M but I have received the limit message on sites as small as 6M. Anyways the fix for this is to increase the maximum. http://blogs.provoke.co.nz/Ari/archive/2007/05/24/increasing-the-maximum-size-of-list-templates.aspx  will show you how. Simple issue this command:

stsadm -o setproperty -propertyname max-template-document-size -propertyvalue 50000000

Then you can export your site template and save it to a local drive on your sharepoint box.

Second barrier:

In order to use your newly exported site template to create a root site collection you will need to add it to the available Site Collection templates: See  http://mindsharpblogs.com/kathy/archive/2007/04/10/1685.aspx

it is another simple stsadm command:

stsadm –o  addtemplate –filename c:\exercise.stp –title exercise

Cheers.

Del.icio.us | Digg It | Technorati | Blinklist | Furl | reddit | DotNetKicks
Posted by notorioustech | with no comments

Live login for SharePoint ready as soon as they release

We have been playing with the test system for integrating live id authentication into web sites so that we will be ready to provide that service when they go live.

see this blog for info on how to proceed with similar integrations: http://msnwindowslive.spaces.live.com/blog/

Our situation here is a little tricky in that we will need to support both standard form logins for existing members and also allow account creation and login using your live id.

The reasoning behind this is to increase the conversion of anonymous users to members so that all our work put into new member features actually gets used. We realize that there are so many sites out there with their own logins and memberships that it gets very tedious to manage.

If you have any questions about this for your own sites feel free to ask. 

Del.icio.us | Digg It | Technorati | Blinklist | Furl | reddit | DotNetKicks

Still Securing SharePoint - from members and anonymous users

When ViewFormPagesLockdown won't work for you and you still want your allitems.aspx and other forms secured then you have to write some code. Let me save you some steps, here is the code for a simple control that you can put at the top of a new master page ( i called mine secure.master ) which is a copy of default.master. I suppose I could have just used inheritence of master pages also. Then use the SP Designer to manually pick and change forms to use this new master page, you can pick multiple at a time also.

This code will by default redirect anonymous users away from the page and will also only allow specified member groups to access the page.

    public class SecureItem : WebControl
    {
        private string mGrantGroups = "";

        public string GrantGroups
        {
            get { return mGrantGroups; }
            set { mGrantGroups = value; }
        }

        private string mRedirPage = "/";

        public string RedirPage
        {
            get { return mRedirPage; }
            set { mRedirPage = value; }
        }
        protected override void OnLoad(EventArgs e)
        {
            string name = Context.User.Identity.Name;
            if (name.Trim() == "")
                Page.Response.Redirect (RedirPage,true);

            if (GrantGroups.Trim() == "") return;
            string[] grps = GrantGroups.Split(",".ToCharArray());
            bool doredir = true;
            try
            {
                for (int i = 0; i < grps.Length; i++)
                    if (grps[i].Trim() != "" && SPContext.Current.Web.IsCurrentUserMemberOfGroup(SPContext.Current.Web.Groups[grps[i].Trim()].ID))
                        doredir = false;

            }
            catch (Exception ee)
            {
                Page.Response.Write(ee.ToString());    
                 doredir = false;               
            }
             if (doredir)
                    Page.Response.Redirect (RedirPage,true); // has to be outside of try catch
        }
    }

Del.icio.us | Digg It | Technorati | Blinklist | Furl | reddit | DotNetKicks
Posted by notorioustech | with no comments

BIG Resource list gets Faceted Drill downs

New release of the big resource list page makes it more user friendly with faceted drill downs and most popular items.

We are working on adding two new features also: Member picks and a flag to show users which resources they have viewed.

This page is a prime example of the extremes that you can take a SharePoint list to.

Del.icio.us | Digg It | Technorati | Blinklist | Furl | reddit | DotNetKicks
Posted by notorioustech | with no comments

Securing SharePoint for internet facing sites

First Read this blog post: http://blogs.msdn.com/ecm/archive/2007/05/12/anonymous-users-forms-pages-and-the-lockdown-feature.aspx

and this technet article http://technet2.microsoft.com/Office/en-us/library/f507f5d6-4c9d-4f98-909f-069c53b9a3f61033.mspx?mfr=true

Then I will tell you what worked for us on this WSS site:

First off securing the allitems.aspx and other forms can't be done with the ViewFormPagesLockdown feature mentioned in the above article as this is a WSS site. We tried to use the location setting in the web.config to restrict these but no luck there unfortunately. That leave use with having to write a custom httphandler which is a post for another day. What we did do for the allitems.aspx is negate its use by restricting the users can only see their own posts in postable lists. We also created a more restrictive permissions role to block some of the download features of document libraries - see earlier post on this.

Our configuration for this site is that of 2 application zones, one is AD authenticated and the other is forms based. SInce the forms based one is really the internet facing one we need to restrict access to more information. Basically most everything under _layouts should be blocked. So for this web application we simple edited the web.conf and added the following entries:

  <location path="_layouts/images">
    <system.web>
      <authorization>
        <allow users="*" />
      </authorization>
    </system.web>
  </location>
  <location path="_layouts/1033">
    <system.web>
      <authorization>
        <allow users="*" />
      </authorization>
    </system.web>
  </location>
  <location path="_layouts/groupeditempicker.js">
    <system.web>
      <authorization>
        <allow users="*" />
       </authorization>
    </system.web>
  </location>
  <location path="_layouts/accessdenied.aspx">
    <system.web>
      <authorization>
        <allow users="*" />
       </authorization>
    </system.web>
  </location>
  <location path="_layouts">
    <system.web>
      <authorization>
        <allow users="notorioustech" />
        <deny users="?,*" />
       </authorization>
    </system.web>
  </location>

Note: the _layouts allow entres are required (fill in the appriate locale for wherever you are) so that pages still display correctly.

Since we have the portal accessable by an AD zone we can still use the _layouts forms from there.

FOLLOWUP: Don't forget to secure you _vti_bin directory.  The web services interface to sharepoint is a big backdoor.

  <location path="_vti_bin">
    <system.web>
      <authorization>
        <allow users="notorioustech" />
        <deny users="?,*" />
       </authorization>
    </system.web>
  </location>

Del.icio.us | Digg It | Technorati | Blinklist | Furl | reddit | DotNetKicks

BIG Resource List approaching 300 pre qualified entries

While there is of course a focus on Enterprise Seach we have tons of entries spanning all topics SharePoint that are important to our readers.

The entries have each been reviewed and categorized to reduce the noise in your research.

You can filter them, rate them and track the popularity of each link.

If you know of a resource that we should have please Add It (need to join first - it's free)

 

Del.icio.us | Digg It | Technorati | Blinklist | Furl | reddit | DotNetKicks
Posted by notorioustech | with no comments

redirect in default.aspx to a page library

On our site we wanted to have all of our pages under version control including the root default.aspx page so that required us to do a redirect from from the root to the /pages/default.aspx.

There are a few ways to do this.

  • The easiest is to add a content web part and add a <script> location.href = '/pages/default.aspx'; </script> but not the most efficient means.
  • or create a simple web part or web control that does a Page.Response.Redirect = "/pages.default.aspx"
  • or what we did is add this to the page

<script language="C#" runat="server">

    void Page_Load()
    {
         Response.Redirect("/pages/default.aspx");  // DO NOT USER Server.Transfer here as it will screw up your relative references.
   }

</script>

NOTE: for this to work you will also need an entry in the web.config file to allow compiling. Looks like this:

  <PageParserPaths>
        <PageParserPath VirtualPath="/default.aspx" CompilationMode="Always" AllowServerSideScript="true" />
      </PageParserPaths>


 

 

Del.icio.us | Digg It | Technorati | Blinklist | Furl | reddit | DotNetKicks
Posted by notorioustech | with no comments

SharePoint Designer Tips and Tricks

 Will keep adding to the blog post as we go.

  • When using the dataform webpart and customizing the xsl manually BE sure to keep the "Show with sample data" check box checked. Otherwise SharePoint designer has a tendency to insert the actual data in place of the xsl so that when you display the data it is just repeating.
  • If you are using versioning in a pages library to enable rollback of changes, you better remove all the webpart zones on the page. The webpart zones cause the webparts to be saved into the database and there is no rollback so even if you rollback your page in the library only your formating outside the zones rolls back. NOTE: once you remove the webpart zones you will only be able to edit the pages in the designer.
  • If you are using the dataview web parts and the designer to build the traditional model of a lists that drills down to a detail page and you are not using web parts you will find that the title for each page will not be aligned with what you are displaying. Not the title that you see on the page, but the one in the top of the browser and more importantly what you see in search results!!!. The fix for this is to first make sure that you are passing the ID of the detail record to the detail page as a query string parameter named "ID" and then you can use the SharePoint "ListItemProperty" control to display whatever column value from the list item you want as the title.  Here is a sample of what your page code will look like

<asp:Content ContentPlaceHolderID="PlaceHolderPageTitle" runat="server" >    
Product:
<Controls:ListItemPropery runat="server" Property="Title" List="154FE4EB-6DC6-4ACA-A5AD-E329E33237EC"  id="ListItemPropery1"></Controls:ListItemPropery>  
</asp:Content>

The list id guid is fairly easy to find out for your list it, just example the generated code for your detail dataview web part, it will be a parameter in there. The Property setting is the column name you want to use for the title. NOTE: If you don't pass ID= in the query string or if the id you pass does not exist in the list you will get that nasty SharePoint exception. To fix this I quickly created my own control that inherited from ListItemProperty and allowed me to specify a different QA parameter other then just ID and also to fail gracefully. Here is the code http://sharepointsearch.com/cs/blogs/site_admin/SPWListItemProperty.cs.txt

Del.icio.us | Digg It | Technorati | Blinklist | Furl | reddit | DotNetKicks
Posted by notorioustech | with no comments
Filed under:

BIG huge spectacular resource listing.

 This took some effort. We have compiled and are compiling all the great resources out there for SharePoint and search. We have categorized them and organized them. Users can now rate and effect the rankings of each resource and add comments.

http://www.sharepointsearch.com/pages/bigresourcelist.aspx

This page was built entirely with SharePoint designer!!!!

Note: if you are counting on versioning in your pages library to allow you to rollback then you are in for a nasty surprise. Because the webparts are in Web part zones they are not actually stored with the .aspx file but in the SharePoint database, so even if you try to rollback a version you still have the same web parts. This caused more than a few headaches as the SharePoint designer kept erasing modifications that I had made in the datalist web part. The FIX: Simple but effective. Remove all Webpart zones from your page and the web parts will now be stored directly on the page. You will no longer be able to configure them in the browser but for the ability to truly use CMS functionality it was worth it.

 

Del.icio.us | Digg It | Technorati | Blinklist | Furl | reddit | DotNetKicks
Posted by notorioustech | with no comments

New note taking functionality - not exactly OneNote but still cool.

Well besides community managed web pages for definitions like wikipedia we have found a pretty cool use for it on our site here.

You will notice when you login ( need to register for membership first) that there are now two additional personal links in the top right "Add Note" and "My Notes".  The add note will pop open a windown no matter where you are on the site and capture the current url and allow you to add comments, links etc and it will be saved in your own personal space which you can access any time by clicking "My Notes".

So what's it good for. As you are doing your research capture your notes and when done go to mynotes to print them all out. They will be saved for as long as you have a membership on the site and cannot be accessed by anyone but you.

Del.icio.us | Digg It | Technorati | Blinklist | Furl | reddit | DotNetKicks
Posted by notorioustech | with no comments
Filed under: ,

Securing SharePoint WSS

As part of our security review on this site we created a simple member account and tried to hack everything.

and OOPS found some stuff. The defaul read privilages that we had assigned to members still allowed some unwanted access. Basically our page library where we store all of our content pages was still allowing users to download a copy of the .aspx page. While not technically a security breach it would have allowed people to copy our functionality without asking.

We have since disabled this by creating a new permission level with just the following enabled

  • View Items  -  View items in lists, documents in document libraries, and view Web discussion comments.
  • View Pages  -  View pages in a Web site.
  • Open  -  Allows users to open a Web site, list, or folder in order to access items inside that container.

and that's it. We do override this for certain lists that users require posting access to like their notes and so forth.

Del.icio.us | Digg It | Technorati | Blinklist | Furl | reddit | DotNetKicks
Posted by notorioustech | with no comments
More Posts Next page »