Many websites have two points of entry for each individual page – one with www and one without. It means that if other websites link to yours, they might link to the same page using two different addresses. If you make sure that all incoming links point to the same address, you also make sure that various page ranking algorithms of the different search engines give the page full credit for each incoming link.

We can achieve this be simply remove the “www” in the URL’s on a website. That also makes the URL shorter and maybe easier recognizable. There are two ways to do this; we can use server-side or client-side techniques. The server-side is the best one, but it cannot be used by all, so I provide a JavaScript version as well.

Client-side

Add this script tag to the header of your web pages. This is the solution I have implemented here on this blog, because I cannot use the server-side approach.

<script type="text/javascript">
var regex = new RegExp("(http|https)://www\.");
var url = location.href;
if (url.match(regex))
{
 url = url.replace(regex, location.protocol + "//");
 location.replace(url);
}
</script>

The reason why I can’t use the server-side approach is because dasBlog is a .NET 1.1 project and I haven’t got Visual Studio 2003 installed on my machine. In with the new, out with the old and face the consequences.

Server-side

The server-side version uses an HttpModule to filter the incoming requests and redirects them to the URL without “www”. I’ve modified a little upon the excellent HttpModule of Keyvan Nayyeri.

private static Regex _Regex = new Regex("(http|https)://www\\.", RegexOptions.IgnoreCase | RegexOptions.Compiled);

private void context_BeginRequest(object sender, EventArgs e)
{
 HttpContext context = (sender as HttpApplication).Context;
 if (context.Request.PhysicalPath.EndsWith(".aspx", StringComparison.OrdinalIgnoreCase))
 {
  string url = context.Request.RawUrl;

  if (_Regex.IsMatch(url))
  {
   url = _Regex.Replace(url, "$1://");
   context.Response.Redirect(url);
  }
 }
}

For discussions about the use of 302 vs. 301 redirections, please see the comments on Keyvan’s post for details and make your own decision.

Implementation

Download the RemoveWwwModule.cs below and put it the App_Code folder in the root of your website. Then add the following lines to the web.config’s <system.web> section:

<httpModules>
  <add type="RemoveWwwModule" name="RemoveWwwModule"/>
</httpModules>

Download

RemoveWwwModule.zip (,66 KB)

Internet Explorer can only make 2 connections at a time, which means that only two elements can be loaded while the rest is queued up. Imaging a web page with 10 Flash movies, then only two of the movies can be loaded at the same time and the rest must wait until there is an available connection open.

That can be a real problem if you want to use the menu to navigate to another page on the website while the Flash movies are loading. Because of the connection pool, you have to wait until you get an available connection before the page is requested. What we want is a way to cancel all the pending requests and make sure we can navigate as fast as possible.

Unfortunately, there is no JavaScript function that will let us cancel requests, so we have to do something else. We can simply tell all the Flash movies not to proceed with the request by setting the movie property to an invalid value. This should be triggered when a link in the menu is clicked.

Put this JavaScript in the <head> section of the document:

<script type="text/javascript">

function CancelFlash()

{

  var elements = document.getElementsByTagName("object");

  if (navigator.appName != "Microsoft Internet Explorer")

    elements = document.getElementsByTagName("embed");

   

  for (i = 0; i < elements.length; i++)

  {

    if (typeof elements[i].IsPlaying() == "boolean")

      elements[i].LoadMovie(0, "notexisting.swf");

  }

}

</script>

Then add the onclick event to all the menu items like so:

>

<a href="products.aspx" onclick="CancelFlash();">Products</a>

It is not common to have many Flash movies embedded on the same web page, but in a recent case there were – a lot of charts – and they all load XML data dynamically created by a HttpHandler. That takes a little bit of time and doubles the HTTP requests made to the server.

The solution is not bullet proof and you have to make sure that the <object> tag has a classid attribute that tells the browser that it is a Flash movie. Then it should be cross-browser compatible.