<!-- Add the rest of your HTML here -->
Redirecting web traffic is a fairly common task, we can redirect from html, from ASP (or other scripting engines) and from ISAPI. This tutorial will demonstrate how to reduce server workload by redirecting from ISAPI using MFC using a “redirection filter”. This example will redirect a requested page, while retaining the URL the user sees in their browser
The code to redirect a page looks something like the following…
<META http-equiv="refresh" content="5; URL=http://somewhere.com/page.asp">
The ASP code to redirect looks like…
The first relies on you having each page set up to redirect, the second is done via ASP which means it requires use of the scripting engine (server hit).
ISAPI Redirection Filter
We can reduce the server load by using ISAPI filters in C++. This will have the same effect – the downside is that you need to know how to use Visual Studio to do it. The upside is that you don’t use ASP. This is filter will change the URL of the file IIS thinks it wants to return, without changing the URL the user sees in their browser
Open Visual Studio (I use version 6.0) Make a new project and select “ISAPI Extension Wizard”.
Give your project a name. I’m using “redirector”, click "OK". You should now be presented with the following.
Tick “Generate Filter Object” and un-tick “Generate a Server Extension Object”. In case I’ll also link statically.
Because we only want to redirect the actual page and not the page the user thinks it is, we’ll tick “Post-processing of the request headers” and select the notification priority we want the filter to have, in this case we’ll select “high” to make sure it gets attention before any other filters. Click “Finish” and Visual Studio will now prepare the project for you.
We will now add our code to redirect all requests from
The function of interest is in
and is called
and it looks something like the following;
This function is called when the server has preprocessed the client headers. In this example we want to modify the URL that IIS thinks its wants to return. We’ll try something simple - replacing all Coldfusion (
.cfm) extensions with
.asp, Why? Perhaps we’re using ASP instead of ColdFusion and don’t want to change the links on the pages themselves.
We need to find out which page has been requested, and then replace
.asp if necessary. To do this we need to use the
pHeaderInfo, and the filter context pointer
We want to see the URL requested, to do this we can ask IIS what the URL was by way of the
DWORD buffSize = sizeof(buffer);
BOOL bHeader=pHeaderInfo->GetHeader(pCtxt->m_pFC, "url",
Once we have the URL we can decide whether to redirect it. I’m going to cheat a little here and use
to deal with the string code, you can use whatever string code you like.
DWORD buffSize = sizeof(buffer);
BOOL bHeader = pHeaderInfo->GetHeader(pCtxt->m_pFC, "url",
if (urlString.Find(".cfm") != -1)
char *newUrlString= urlString.GetBuffer(urlString.GetLength());
pHeaderInfo->SetHeader(pCtxt->m_pFC, "url", newUrlString);
Now, build the file and with any luck there will be no errors!
Adding the Filter to IIS
Next you will want to add the filter to IIS, or Personal Web Service if you are using it. I’m now going to describe how to add the filter to Personal Web Service.
So, go to Administrative tools (in Windows 2000) and select Internet Services Manger, something like the following will now appear.
Right click on “Default Web Site” (or whatever web server you want to add it to) and select “properties”, the following windows should then appear.
From the tabs, click on “ISAPI Filters”
Now, assuming there are no filters already present, the box in the middle should be clear (as this example shows) Click the “Add” button…
Give your filter a “name”, and use the browse button to locate the redirection filter
Click “OK” and the filter will now appear, if you want your filter to have higher priority than others that may appear in the list, use the buttons on the left hand side to organize the correct order.
Click “OK”. The tabbed dialog will disappear.
Next we want to stop and start the web service. Right click on the “Default Web Site”, select “Stop” then right click again and select “Start”.
Alternatively you can click the black square on the rebar to stop the service, and click the “Start item” (black triangle) to restart it.
Make a file
test.asp and place it in your
wwwroot directory of
inetpub. Open your web browser and open location http://localhost/test.cfm. If all goes well then the contents of
test.asp will be displayed in the browser.
That’s it, you’re done!