Click here to Skip to main content
15,867,141 members
Articles / Web Development / ASP.NET
Article

URL rewrite for .NET 2.0

Rate me:
Please Sign up or sign in to vote.
3.88/5 (14 votes)
10 Dec 20052 min read 110.5K   58   17
Simple URL rewrite for .NET 2.0.

Introduction

This is another article that describes the different solutions used to build sharpcms.net. I wrote this to get started with writing the technical descriptions about how we made the solution and to share our ideas with the community. The primary article on CodeProject can be read from here.

For the sharpcms.net project we needed a simple way to rewrite the URLs to get rid of the nasty queries like the ID etc. When we first started the project we wrote a system where we only needed a single query to handle most of the requests. Check out this one.

Therefore, it was a very easy job to make a URL rewrite solution, so the URL would look like this: http://www.sharpcms.net/show/danish/about.aspx.

The solution

We inserted a begin request handler in the global.asax file in the root directory. This handler checked to see if there existed a file with the name requested. In that case, I would not do anything. For example, a request like this: sharpcms.dk/admin.aspx. It would check to see if there existsed a file with that name in the root directory. If not it would rewrite the query to: sharpcms.dk/default.aspx?process=admin.aspx.

This is only rewritten on the server and the client still thinks that it uses the first URL. This is a nice thing because it still looks pretty in the browser. But it has one problem. The browser gets confused because all the relative paths are now incorrect. Therefore, you need to define the base path in HTML header like this:

HTML
<html>
   <head>
        <base href="http://www.sharpcms.dk/">
   </head>
</html>

Since our project is an open source project the base path changes from system to system so we wrote a little script to let the server figure out the correct path:

[Editor comment: Line breaks used to avoid scrolling.]

C#
string basepath = 
  httpPage.Request.ServerVariables["SERVER_PROTOCOL"].
                                    Split('/')[0].ToLower() 
  + "://" + httpPage.Request.ServerVariables["SERVER_NAME"] 
  + ":" + httpPage.Request.ServerVariables["SERVER_PORT"] 
  + httpPage.Request.ApplicationPath.TrimEnd('/')+ "/";

This makes it a lot more dynamic with websites that have more than one domain associated.

Since the .NET Framework on IIS only handles certain extensions like .aspx you have to end the URL with aspx.

The global.asax file

I am not satisfied with the code yet. It looks to me that there should be a nicer or a more cleaner way to do this. I haven't found it yet though. We have tested the code for a while now and it works even with virtual paths.

The code to be placed in the global.asax file is this:

[Editor comment: Line breaks used to avoid scrolling.]

C#
void Application_BeginRequest(object sender, EventArgs e) { 

    System.Web.HttpContext httpContext = HttpContext.Current;
    String currentURL = httpContext.Request.Path.ToLower(); 
    string processPath = 
      currentURL.Substring(httpContext.Request.ApplicationPath.Length).
                                               TrimStart('/').ToLower();
    
    //Creates the physical path on the server 
    string physicalPath = httpContext.Server.MapPath(
                  currentURL.Substring(currentURL.LastIndexOf("/") + 1));
    
    //checks to see if the file does not exsists.
    if (!System.IO.File.Exists(physicalPath))
    {
    
        string queryString = 
               httpContext.Request.ServerVariables["QUERY_STRING"];
        string defaultPage = "~/default.aspx?process=";
        
        if (processPath.EndsWith(".aspx"))
        {
        
        
            processPath = processPath.Substring(0, 
                            processPath.Length - ".aspx".Length); 
        
        } 
        // Rewrites the path
        httpContext.RewritePath(
                      defaultPage + processPath + "&" + queryString);
    } 
}

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
Web Developer
Denmark Denmark
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
QuestionNice article Pin
Navin Pandit13-Jun-12 20:00
Navin Pandit13-Jun-12 20:00 
GeneralImage path problem Pin
anrorathod22-Aug-07 1:30
anrorathod22-Aug-07 1:30 
GeneralRe: Image path problem Pin
Seema Gosain20-Nov-08 23:42
Seema Gosain20-Nov-08 23:42 
GeneralRewriting a folder Pin
Evan Camilleri13-Feb-07 5:30
Evan Camilleri13-Feb-07 5:30 
GeneralRe: Rewriting a folder Pin
User 299712428-Feb-07 1:11
User 299712428-Feb-07 1:11 
GeneralRe: Rewriting a folder Pin
Evan Camilleri28-Feb-07 5:04
Evan Camilleri28-Feb-07 5:04 
GeneralRe: Rewriting a folder Pin
User 29971241-Mar-07 13:43
User 29971241-Mar-07 13:43 
GeneralRe: Rewriting a folder Pin
Evan Camilleri1-Mar-07 23:33
Evan Camilleri1-Mar-07 23:33 
GeneralRe: Rewriting a folder Pin
N a v a n e e t h13-May-07 23:20
N a v a n e e t h13-May-07 23:20 
GeneralBetter version... Pin
Sire40412-Dec-05 3:29
Sire40412-Dec-05 3:29 
GeneralRe: Better version... Pin
peterhansen212-Dec-05 3:39
peterhansen212-Dec-05 3:39 
GeneralRe: Better version... Pin
Sire40412-Dec-05 4:10
Sire40412-Dec-05 4:10 
GeneralSuggestion Pin
Wade Reynolds12-Dec-05 3:06
Wade Reynolds12-Dec-05 3:06 
GeneralRe: Suggestion Pin
peterhansen212-Dec-05 3:49
peterhansen212-Dec-05 3:49 
GeneralRe: Suggestion Pin
Richard Priddy8-Feb-07 4:17
Richard Priddy8-Feb-07 4:17 
Generalnice idea :) Pin
Francesco Aruta11-Dec-05 2:38
Francesco Aruta11-Dec-05 2:38 
GeneralFeedback Pin
peterhansen211-Dec-05 6:17
peterhansen211-Dec-05 6:17 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.