![]() |
Web Development »
ISAPI »
General
Intermediate
How to make an ISAPI redirection filterBy bryceHow to build a simple ISAPI Filter |
VC6Win2K, WinXP, Win2003, MFC, Dev
|
|
Advanced Search |
|
|
|
||||||||||||||||
<META http-equiv="refresh" content="5; URL=http://somewhere.com/page.asp">
response.redirect �chrismaunderfanclub.com�
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).
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.
Click Next...
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.
.cfm to .asp The function of interest is in redirector.cpp and is called OnPreprocHeaders and it looks something like the following;
DWORD CRedirectorFilter::OnPreprocHeaders(
CHttpFilterContext* pCtxt,
PHTTP_FILTER_PREPROC_HEADERS pHeaderInfo
)
{
return SF_STATUS_REQ_NEXT_NOTIFICATION;
}
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 .cfm with .asp if necessary. To do this we need to use the HTTP_FILTER_PREPROC_HEADERS pointer, pHeaderInfo, and the filter context pointer pCtxt.
We want to see the URL requested, to do this we can ask IIS what the URL was by way of the GetHeader function
DWORD CRedirectorFilter::OnPreprocHeaders(
CHttpFilterContext* pCtxt,
PHTTP_FILTER_PREPROC_HEADERS pHeaderInfo
)
{
char buffer[256]
DWORD buffSize = sizeof(buffer);
BOOL bHeader=pHeaderInfo->GetHeader(pCtxt->m_pFC, "url",
buffer, &buffSize);
...
}
Once we have the URL we can decide whether to redirect it. I�m going to cheat a little here and use CString to deal with the string code, you can use whatever string code you like. DWORD CRedirectorFilter::OnPreprocHeaders(
CHttpFilterContext* pCtxt,
PHTTP_FILTER_PREPROC_HEADERS pHeaderInfo
)
{
char buffer[256];
DWORD buffSize = sizeof(buffer);
BOOL bHeader = pHeaderInfo->GetHeader(pCtxt->m_pFC, "url",
buffer, &buffSize);
CString urlString(buffer);
urlString.MakeLower(); // for this exercise
if (urlString.Find(".cfm") != -1) //we want to redirect this file
{
urlString.Replace(".cfm",".asp");
char *newUrlString= urlString.GetBuffer(urlString.GetLength());
pHeaderInfo->SetHeader(pCtxt->m_pFC, "url", newUrlString);
return SF_STATUS_REQ_HANDLED_NOTIFICATION;
}
//we want to leave this alone and let IIS handle it
return SF_STATUS_REQ_NEXT_NOTIFICATION;
}
Now, build the file and with any luck there will be no errors!
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 .dll file.
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!
General
News
Question
Answer
Joke
Rant
Admin
|
PermaLink |
Privacy |
Terms of Use
Last Updated: 10 Sep 2003 Editor: Rob Manderson |
Copyright 2003 by bryce Everything else Copyright © CodeProject, 1999-2009 Web17 | Advertise on the Code Project |