0 Comments

I’ve been working on the URL structure on the upcoming version of BlogEngine.NET. In the current version, the URL wasn’t very pretty when viewing posts on certain dates or all posts in a month. It looked like this for a specific date:

example.com/blog/?date=2007-12-19

and like this for a specific month in a year:

example.com/blog/?year=2007&month=12

That’s the way they have looked since BlogEngine.NET 1.0 and I must admit they look awful. I just never gave it much thought to improve on them.

Then the other day I gave it some thought and for some stupid reason, I thought it would be cool to use the PathInfo part of the URL instead of the query string. So now the URLs looked like this:

example.com/blog/default.aspx/2007/12/19/

and

example.com/blog/default.aspx/2007/12/

This was of course an improvement since they became much more similar and used the same logical structure. The problem is that by using the PathInfo without some kind of URL rewriting at the same time, the relative root URL changes from /blog/ into /blog/default.aspx/2007/12/19/ which of course ruins a lot of things.

Today I finally saw the light. I have no idea why it took me so long, but I guess that late is better than never. The URLs now look like this:

example.com/blog/2007/12/19/default.aspx

and

example.com/blog/2007/12/default.aspx

and because I saw the light I’ve also added the next logical step, which is to display all posts in a given year like so:

example.com/blog/2007/default.aspx

What’s really stupid is that every other blog platform uses this URL structure. I must have had my head up my butt. When I was at it I also changed the calendar URL from

example.com/blog/default.aspx?calendar=show

to

example.com/blog/calendar/default.aspx

All the old URLs still work, so no links will be broken.

The .aspx extension

Now you might wonder why the default.aspx is needed at the end of the URLs. If I had a choice about it, trust me, it would be history. The thing is that on hosted servers where you cannot touch the IIS you will not be able to pass all incoming requests to the ASP.NET ISAPI filter. Only a few extensions including .aspx do. So in order to make sure the URL will work on those servers, we need the .aspx extension. It didn’t have to be default.aspx it could be anything ending with .aspx, but I thought default.aspx was one people had seen before and wasn’t confused about.

We’ll have to wait for IIS 7 to be released before we can construct URLs without the .aspx extension on hosted servers.

You can test the new URL on this blog.